进程是资源分配的最小单位,线程是CPU调度的最小单位。

    JAVA线程状态
    ①初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
    ②运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。

    1. 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。
    2. 就绪状态的线程在获得cpu 时间片后变为运行中状态(running)。

    ③阻塞(BLOCKED):表线程阻塞于锁。【下图勘误:notify()由WAITING变为BLOCKED,而不是直接变为RUNNABLE或READY】
    ④等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
    ⑤超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间内自行返回。
    image.png


    Java线程间通信:

    1. volatiesynchronized 关键字;
    2. 等待/通知机制( wait() / notify() ),其经典范式如下: ```java synchronized(LockObj){ // 等待方 while(等待条件){ // 类似自旋锁的结构
      1. LockObj.wait();
      } Do Somthing; }

    synchronized(LockObj){ // 通知方 改变等待条件(如结果要求、超时要求等) LockObj.nofityAll(); }

    1. 3. 管道通信,其使用方法如:
    2. ```java
    3. Piped out = new PipedWriter();
    4. Piped in = new PipedWriter();
    5. out.connect(in);
    6. // Any $Thread use $in to recevied message:
    7. while((recevie = in.read()) != -1) { $use recevie$ }
    8. // Any $Thread use $out to send message:
    9. out.write(Something);
    1. Thread.join() :当前线程等待thread终结之后才从thread.join()处返回。如线程A持有线程B的引用,执行 B.join() 会等待B结束后才继续A的操作。
    2. ThreadLocal (线程变量):该key-value的map结构(以线程为隐式key)被捆绑到线程上,使用 set(T)get() 来定向获取一个与线程捆绑的值。使用如下:
      1. In global domain:
      2. final ThreadLocal<T> EXAMPLE_THREADLOCAL = new ThreadLocal<T>(){
      3. protected T initialValue(){return null};
      4. };
      5. // In any thread:
      6. EXAMPLE_THREADLOCAL.set(T);
      7. EXAMPLE_THREADLOCAL.get();