线程基础
线程创建的方式
- new Thread,重写run方法
- 实现Runnable接口,重写run方法
- 实现Callable接口,重写call方法
- 通过线程池方式创建
底层的来说就一种 即通过thread.start()创建并开启线程
线程状态

new:线程创建了但没start
反复调用线程的start是否可行?线程执行完毕再次start是否可行?都不行,因为start后threadStatus会改变,再次调用start方法会抛IllegalThreadStateException异常
runnable:线程正在执行代码中,也可能正在等待cpu调度
blocked:阻塞等待锁中
waiting:等待状态,有三种可能:
Object.wait():使线程变为等待中,直到其他线程唤醒它
Thread.jion():等待线程执行完毕,底层其实是Object.wait()
LockSupport.park():
timed_waiting:超时等待,时间到了自动觉醒,有以下可能
wait(time)
Thread.sleep(time)
jion(time)
parkNacos(time)
terminated:终止状态,表示线程已执行完毕
线程优先级
thread.setPriority() 设置线程优先级,分为1-10 默认5。哈哈哈,只是建议,低的不比高的后
多线程带来的问题
多线程之间,单个线程执行的流程可能不是原子性的,途中可能会有其他线程影响
多个线程之间,数据的可见性可能不是实时的,可能导致数据对不上
要解决以上问题,就得引入多线程 同步机制,例如加锁。但这又会引入新的问题,如死锁,锁开销,锁饥饿
多线程还会带来线程上下文切换的开销
线程安全
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。
如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
线程存活
isAlive() 可判断线程是否是存活
虚假唤醒
java 线程之间是如何通信的
Java中线程通信方式七种_java线程间通信的方式-CSDN博客
总的来说,线程之间通信有三种模型,一种是共享内存的形式,一种是消息传递的方式(也叫等待-通知),一种是
管道流。在java中一共有八种,volatile,synchronized,Interrupt,wait,notify,notifyAll,jion,管道通信
实现管道通信,我们可以使用jdk自带的PipedOutputStream和PipedInputStream,或者PipedWriter,PipedReader