java并发 wait,notify,notifyAll,synchronized(一)
/** * */package com.mutex;/** * 用wait(),notify()实现线程的互斥 * * 当MainTask运行10次以后,SubTask运行5次,如此依次循环交替执行 * */public class MainClient {//决定线程是否运行public static volatile boolean notifyRun=true;//对象锁public static final Object Lock=new Object();/** * @param args */public static void main(String[] args) throws Exception{//主任务运行new Thread(new MainTask()).start();Thread.sleep(1000);//子任务运行new Thread(new SubTask()).start();}}
?
?
? ? ?
package com.mutex;public class MainTask implements Runnable {private int n = 10;@Overridepublic void run() {while (true) {System.out.println(" -------- MainTask -----------");//获取对象MainClient.Lock上的锁synchronized (MainClient.Lock) {if(!MainClient.notifyRun){//唤醒MainClient.Lock wait set中的所有线程MainClient.Lock.notifyAll();MainClient.notifyRun=true;}if(MainClient.notifyRun){for (int i = 1; i <= n; i++) {System.out.println("MainTask run." + i);}try {//本线程放入wait set,释放对象MainClient.Lock上的锁MainClient.Lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}}
?
?
?
? ??
package com.mutex;public class SubTask implements Runnable{private int n=5;@Overridepublic void run() {while(true){System.out.println(" -------- SubTask -----------");//获取对象MainClient.Lock上的锁synchronized (MainClient.Lock) {if(!MainClient.notifyRun){try {MainClient.Lock.wait();} catch (InterruptedException e) {e.printStackTrace();}MainClient.notifyRun=true;}for(int i=1;i<=n;i++){System.out.println("SubTask run."+i);} //本线程放入wait set,释放对象MainClient.Lock上的锁,让MainTask运行 MainClient.Lock.notifyAll(); MainClient.notifyRun=false;}}}}
?
?
运行结果:
?-------- MainTask -----------
MainTask run.1
MainTask run.2
MainTask run.3
MainTask run.4
MainTask run.5
MainTask run.6
MainTask run.7
MainTask run.8
MainTask run.9
MainTask run.10
SubTask run.1
SubTask run.2
SubTask run.3
SubTask run.4
SubTask run.5
?-------- SubTask -----------
?-------- MainTask -----------
MainTask run.1
MainTask run.2
MainTask run.3
MainTask run.4
MainTask run.5
MainTask run.6
MainTask run.7
MainTask run.8
MainTask run.9
MainTask run.10
SubTask run.1
SubTask run.2
SubTask run.3
SubTask run.4
SubTask run.5
?-------- SubTask -----------
?-------- MainTask -----------
MainTask run.1
MainTask run.2
MainTask run.3
MainTask run.4
MainTask run.5
MainTask run.6
MainTask run.7
MainTask run.8
MainTask run.9
MainTask run.10
SubTask run.1
SubTask run.2
SubTask run.3
SubTask run.4
SubTask run.5
?-------- SubTask -----------
?-------- MainTask -----------
MainTask run.1
MainTask run.2
MainTask run.3
MainTask run.4
MainTask run.5
MainTask run.6
MainTask run.7
MainTask run.8
MainTask run.9
MainTask run.10
SubTask run.1
SubTask run.2
SubTask run.3
SubTask run.4
SubTask run.5
?-------- SubTask -----------
?-------- MainTask -----------
MainTask run.1
MainTask run.2
MainTask run.3
MainTask run.4
MainTask run.5
MainTask run.6
MainTask run.7
MainTask run.8
MainTask run.9
MainTask run.10
SubTask run.1
SubTask run.2
SubTask run.3
SubTask run.4
SubTask run.5
? ?
?