java并发-
一、线程的状态
线程的状态包括新建(初始状态)、就绪、运行、死亡(终止)、阻塞;
(1)简化版本

(2)结合java线程方法版本

(2)线程通信
-
wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或notifyAll()方法来唤醒该线程。该wait()方法有3种形式——无时间参数的wait(一直等待,直到其他线程通知),带毫秒参数的wait和带毫秒、毫微秒参数的wait(这两种方法都是等待指定时间后自动苏醒)。调用wait()方法的当前线程会释放对该同步监视器的锁定。
-
notify():唤醒在此同步监视器上等待的单个线程。如果所有线程都在此同步监视器上等待,则会选择唤醒其中一个线程。选择是任意性的。只有当前线程放弃对该同步监视器的锁定后(使用wait()方法),才可以执行被唤醒的线程。
-
notifyAll():唤醒在此同步监视器上等待的所有线程。只有当前线程放弃对该同步监视器的锁定后,才可以执行被唤醒的线程。
使用示例:
package test;
public class ThreadComm {
public static boolean WASHED = false;
public static void wash(int i) {
System.out.println(i + "已经洗手");
WASHED = true;
}
public static void eat(int i) {
System.out.println(i + "已经吃饭");
WASHED = false;
}
public static void main(String[] args) {
// wash线程
for (int i = 0; i <= 5; i++) {
int j = i;
new Thread(new Runnable() {
@Override
public void run() {
doWash(j);
doEat(j);
}
private synchronized void doWash(int i) {
if (!WASHED) {// 如果还没洗手,就执行洗手操作,否则,阻塞当前线程,直到吃饭完成
ThreadComm.wash(i);
notifyAll();
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}// doWash
private synchronized void doEat(int i) {
if (WASHED) {// 已经洗完手,唤起当前吃饭线程
ThreadComm.eat(i);
notifyAll();
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}// doEat
}).start();
}// for
}
}


