1.进程?线程?多线程?
进程就是正在运行的程序,他是线程的集合.
线程是正在独立运行的一条执行路径.
多线程是为了提高程序的执行效率.
2.同步?异步?
同步: 单线程
异步: 多线程
3.守护线程?非守护线程(用户线程)?
守护线程: 和main相关,和主线程一起销毁.(例如:gc线程,垃圾回收机制,主要回收主线程垃圾,和主线程一起销毁)
非守护线程: 也叫用户线程,也就是用户自己创建的线程,和主线程没有一点联系,互补干扰,也就是说,主线程挂了,用户线程也不会挂
非守护线程转换为守护线程: 线程对象.setDaemon(true);
4.线程的几种状态:
新建状态: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();
}
}