进程是资源分配的最小单位,线程是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. 管道通信,其使用方法如:
```java
Piped 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();