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 } }