线程基础

线程创建的方式

  1. new Thread,重写run方法
  2. 实现Runnable接口,重写run方法
  3. 实现Callable接口,重写call方法
  4. 通过线程池方式创建

底层的来说就一种 即通过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