学习Java的10天
-
程序:
- 一组指令的集合,即指一 段静态的代码,静态对象。
-
进程:
- 是程序的一次执行过程,或是正在运行的一个程序。
- 是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周期
- 进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域 。
-
线程:
-
线程的理解
-
What:
-
线程是比进程更小的执行单位,是在一个程序(也叫做一个进程)去处理多个任务,这一个任务就叫做线程。线程是来回切换的,需要加载哪个线程就加载哪个。
-
线程共享电脑分配的同一块内存区间,使用相同的堆。
-
特点:线程不能独立运行,必须依赖于进程,在进程中运行。每个程序至少有一个线程称为主线程
-
-
-
-
开启多线程的优点和缺点
- 提高界面程序响应速度。通过使用线程,可以将需要大量时间完成的流程在后台启动单独的线程完成,提高前台界面的相应速度。
- 充分利用系统资源,提高效率。通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的性能。
- 当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。
- 多个线程操作共享的内存资源,可能会带来哪个线程操作资源的问题,叫做安全隐患。
-
线程的创建和使用 重要
-
//1.创建一个Tread类的子类 class MyThread extends Thread { @Override public void run() { //2.将此线程的操作声明在run() for (int i = 0; i <100 ; i++) { if (i % 2 == 0){ System.out.println(i); } } } } public class ThreadTest { public static void main(String[] args) { //main方法中对应的就是主线程 //3.创建子线程类的对象 MyThread t1 = new MyThread(); //4.通过子线程对象去调用start方法 //4.1启动当前线程(相当于开始一个新的线程) //4.2调用当前线程的run方法 t1.start(); for (int i = 0; i <100 ; i++) { if (i % 2 != 0){ System.out.println(i+"mian()"); } } } }
-
创建多个线程去执行不同的事情
//创建两个线程 分别输出100以内的奇数和偶数 public class Multread { public static void main(String[] args) { new Thread() { @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 == 0) { System.out.println(Thread.currentThread().getName()+i); } } } }.start(); new Thread() { @Override public void run() { for (int i = 0; i < 100; i++) { if (i % 2 != 0) { System.out.println(Thread.currentThread().getName()+i); } } } }.start(); } }
-
Thread中的常用方法
- run():将创建的线程所要执行的操作声明在此方法当中
- start():启动当前线程,调用当前线程的run()
- getName():获取当前线程的名称
- setName():设置当前线程的名称
- currentThread:静态方法,返回当前执行代码的线程
- yield():释放当前cpu的执行权。
- join():调用该方法时,在线程a中调用线程b的join,此时线程a就进入阻塞状态,直到线程b执行完之后,线程a才开始执行。
- stop():强制停止该线程 不建议使用该方法
- sleep(long millitime):让当前线程睡眠指定的时间,在指定的时间内,该线程是阻塞状态。
- isLive():判断线程是否存活。
-
线程的调度
-
时间片:cpu 自动切换不同的线程
-
抢占式:高优先级抢占cpu
-
线程的优先级等级
-
MAX_PRIORITY:10
-
MIN _PRIORITY:1
-
NORM_PRIORITY:5
-
getPriority() :获取线程优先值
-
setPriority(int newPriority) :设置线程的优先级
-
注意:优先级高不一定优先执行,只是说优先级高的执行概率高。
public class TreadMethod { public static void main(String[] args) throws InterruptedException { MyTread t1 = new MyTread(); Thread.currentThread().setPriority(1); t1.setPriority(10); //设置当前线程的优先级 一般在start之前 t1.start(); int m = Thread.currentThread().getPriority(); //获取当前的线程优先级 默认为2 System.out.println(m); for (int i = 0; i <100 ; i++) { System.out.println(i); if (i == 3){ t1.join(); } } } } class MyTread extends Thread { @Override public void run(){ for (int i = 0; i <100 ; i++) { try { int n = getPriority(); System.out.println(n); sleep(2000); System.out.println("睡了5秒钟"); } catch (InterruptedException e) { e.printStackTrace(); } } } }
-
-
-
创建多线程的方式之一--继承Thread类的方式
class Treadtest extends Thread { private static int ticket = 100; @Override public void run() { for (int i = 0; i < 100; i++) { if (ticket > 0) { System.out.println("这是" + getName() + "卖的票" + " 票号 " + ticket--); } else break; } } } public class SellTicket { public static void main(String[] args) { Treadtest t1 = new Treadtest(); Treadtest t2 = new Treadtest(); Treadtest t3 = new Treadtest(); t1.setName("窗口1:"); t2.setName("窗口2:"); t3.setName("窗口3:"); t1.start(); t2.start(); t3.start(); } }
-
创建多线程的方式之二--实现了runnnable接口的类
-
创建一个实现了runnnable接口的类
-
实现类去实现runnable中的抽象方法 run()
-
创建实现类的对象
-
将此对象作为参数传递到Tread类的构造器当中,创建
Tread类的对象。
-
通过Thread类的对象调用start()
class Mythread implements Runnable{ //创建一个runnable的实现类 @Override public void run() { for (int i = 0; i <100 ; i++) { if (i % 2 == 0 ){ System.out.println(i); } } } } public class Test { public static void main(String[] args) { //2.创造此实现类的对象 Mythread mythread = new Mythread(); //3.将此实现类的对象作为参数放到Thread类的构造器当中 Thread t1 = new Thread(mythread); //4.调用start方法 //4.1开始当前的线程 //4.2调用当前线程的run //4.3Thread的构造方法的参数类型是runnable类型 的 正好在Thread当中声明的了一个 //runnable类型的target变量, // 这时传入的实现了runnable接口的实现类的对象 //正好使得target不为null 这时 当前的对象t1就调用mythread再调用run()方法 t1.start(); } }
-
-
比较两种创建线程的方式
- 优先选择Runnable接口的方式
- 实现的方式没有类的单继承性的局限性
- 更适合处理多个线程有共享数据的状况。
- Thread类本身也实现了runnable接口