进程是资源分配的最小单位,线程是CPU调度的最小单位。
JAVA线程状态:
①初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
②运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。
- 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。
- 就绪状态的线程在获得cpu 时间片后变为运行中状态(running)。
③阻塞(BLOCKED):表线程阻塞于锁。【下图勘误:notify()由WAITING变为BLOCKED,而不是直接变为RUNNABLE或READY】
④等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
⑤超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间内自行返回。 
Java线程间通信:
volatie和synchronized关键字;- 等待/通知机制(
wait()/notify()),其经典范式如下: ```java synchronized(LockObj){ // 等待方 while(等待条件){ // 类似自旋锁的结构
} Do Somthing; }LockObj.wait();
synchronized(LockObj){ // 通知方 改变等待条件(如结果要求、超时要求等) LockObj.nofityAll(); }
3. 管道通信,其使用方法如:```javaPiped out = new PipedWriter();Piped in = new PipedWriter();out.connect(in);// Any $Thread use $in to recevied message:while((recevie = in.read()) != -1) { $use recevie$ }// Any $Thread use $out to send message:out.write(Something);
Thread.join():当前线程等待thread终结之后才从thread.join()处返回。如线程A持有线程B的引用,执行B.join()会等待B结束后才继续A的操作。ThreadLocal(线程变量):该key-value的map结构(以线程为隐式key)被捆绑到线程上,使用set(T)和get()来定向获取一个与线程捆绑的值。使用如下:In global domain:final ThreadLocal<T> EXAMPLE_THREADLOCAL = new ThreadLocal<T>(){protected T initialValue(){return null};};// In any thread:EXAMPLE_THREADLOCAL.set(T);EXAMPLE_THREADLOCAL.get();
