进程?线程?多线程?同步?异步?守护线程?非守护线程(用户线程)?线程的几种状态?多线程中的方法join()?

时间:2021-02-19 20:30:16

1.进程?线程?多线程?

  进程就是正在运行的程序,他是线程的集合.

  线程是正在独立运行的一条执行路径.

  多线程是为了提高程序的执行效率.
2.同步?异步?

  同步: 单线程

  异步: 多线程

3.守护线程?非守护线程(用户线程)?

  守护线程: 和main相关,和主线程一起销毁.(例如:gc线程,垃圾回收机制,主要回收主线程垃圾,和主线程一起销毁)

  非守护线程: 也叫用户线程,也就是用户自己创建的线程,和主线程没有一点联系,互补干扰,也就是说,主线程挂了,用户线程也不会挂

  非守护线程转换为守护线程: 线程对象.setDaemon(true);

4.线程的几种状态:

进程?线程?多线程?同步?异步?守护线程?非守护线程(用户线程)?线程的几种状态?多线程中的方法join()?

  新建状态:new Thread()

  就绪状态:等待cpu的调度,调用start方法

  运行状态:cpu开始执行,调用run方法

  阻塞状态:调用sleep方法或wait方法,等待cpu的再次调度

  死亡状态:run方法执行完成或者调用stop方法

5.多线程中的方法join()

  Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。

  A线程代码内部中调用B.join();则A会放弃CPU的执行权,等到B执行完之后再执行;

  A线程代码内部中调用B.join(100);则A会放弃CPU的执行权100毫秒,然后再执行;

  join方法必须在线程start方法调用之后调用才有意义。

package com.moti.test;
/**
* join方法的使用:
* 现在有三个进程,让3号进程在1号进程执行后再执行,2号进程在3号进程执行完再执行
* @author Moti
* @Time 2019年7月7日
*/
public class Demo {
public static void main(String[] args) throws Throwable {
Thread thread1 = new Thread(()-> {
for (int i = 0; i < 3; i++) {
System.out.println("1号线程"+i);
}
});
Thread thread3 = new Thread(()-> {
try {
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 3; i++) {
System.out.println("3号线程"+i);
}
});
Thread thread2 = new Thread(()-> {
try {
thread3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 3; i++) {
System.out.println("2号线程"+i);
}
});
thread1.start();
thread2.start();
thread3.start();
}
}