多线程的作用就是开辟了多条路径。
一个线程就是独立的执行路径
线程的运行由调度器来安排调度 调度器与操作系统紧密相关
线程会带来额外的开销
创建线程的三种方式
1.extends Thread
2.implements Runnable
重写run方法(必须try catch)
new Thread(new 对象).start(); //不保证立即运行 由CPU调度
3.实现Callable 借口 有返回值(不常用)
call 可以有返回值 throw Exception
线程和lambda表达式结合
//jdk 简化 lambda
new Thread(()->{
for (int i = 0; i < 20; i++) {
System.out.println("一边听歌");
}
});
线程的五种状态
新生状态:New Thread();
就绪状态:start() 线程进入就绪状态
运行状态:线程被调度 获取cpu 进入运行状态
阻塞状态: sleep wait join 其他操作如 read write 等引起的阻塞事件让线程进入阻塞状态
阻塞事件解除后 线程重新进入就绪
死亡状态:
stop destroy。不建议使用
终止线程:
1.线程正常执行完毕
2.外部干涉--- 加入标识(不要使用 stop destroy)
提供一个boolean 型的终止变量
线程内关联标识
提供修改终止变量方法 外部改变
sleep yield join
sleep 线程等待 仍持有CPU (常用于网络延时或者倒计时)
Thread.sleep();
yield 让出cpu 让当前正在执行的线程暂停 让出cpu 转入就绪状态
Thread.yield();
join 合并线程 插队线程 :将此线程执行完成后,再执行其它线程,其他线程阻塞。
对象.join()//当前线程被阻塞 该对象插队执行
线程优先级 1-10 NORM_PRIORITY 5 默认
优先调用级别高的线程 不代表绝对的先后顺序
守护线程damon:多用于后台操作日志 监控内存使用
用户线程和守护线程 :虚拟机必须确保用户线程执行完毕 不用等待守护线程
默认线程 :用户线程
设置为守护线程 :thread.setDaemon(true);