本文参考黑马程序员:https://www.bilibili.com/video/BV16J411h7Rd?p=11
总结
- java线程分为6种状态 new是创建一个线程进入创建状态,操作系统则把线程状态分为五个:创建,可运行(就绪),运行,阻塞,终止。(这部分可参考操作系统)
- start与run方法–start在线程中执行方法,run在主线程执行。thread.run()
- sleep与yield sleep有限时间阻塞,yield让出线程进入就绪(也是阻塞)
- join 调用线程等待被调用线程
- interrupt有打断标记(可以判断打断的是阻塞进程还是活动进程)
- 不推荐suspend stop resume这些方法操纵打断线程,可能引起资源阻塞
- 守护线程:非守护线程结束所有守护线程均停止
- 守护线程例子:1.垃圾回收器线程2.tomcat的 Acceptor 和 Poller
- 虚拟机栈和线程相关联,方法的运行都在栈中。(栈帧)
- 程序计数器与线程有关 ,记录上下文切换断点,记录下一条字节码指令的地址
- 线程实现:1.继承thread(实现父类run)。2.创建Runnable接口(接口实现run)并传参给Thread(使用lamda表达式优化:
Runnable r = ()->{ };
) - Runnable是分离了线程的创建与任务的编写。
- 相比较Thread,Runnable更加灵活,脱离继承
- 实现线程返回结果可以使用futureTask,创建方法就是创建futureTask然后构造参数选择实现callable接口(实现call方法),将task再传入thread构造器即可。
- 只有当线程创建并自发竞争时会进入blocked状态,其它只要是调用方法则会线程进入waiting或者是timed_waiting。
线程状态
java将阻塞状态更加细分了。实际上这是对线程不同方法的实现
方法
线程创建
public class Test3 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//需要传入一个Callable对象
FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("线程执行!");
Thread.sleep(1000);
return 100;
}
});
Thread r1 = new Thread(task, "t2");
r1.start();
//获取线程中方法执行后的返回结果
System.out.println(task.get());
}
}
状态转换
只有当线程创建并自发竞争时会进入blocked状态,其它只要是调用方法则会线程进入waiting或者是timed_waiting。