package com.jdcloud.xue.gang.notifiyall; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; public class NotifyAllTester { public static final Object LOCKER = new Object(); static class Notifier extends Thread{ private Object locker; public Notifier(Object locker) { super(); this.locker = locker; } private void printNotify(){ synchronized (locker) { System.out.println("[Notify]----1" ); //通知全部wait狀態的locker this.locker.notifyAll(); //通知其中一個線程 //this.locker.notify(); System.out.println("[Notify]----2" ); } } @Override public void run() { printNotify(); } } static class Waiter extends Thread{ private Object locker; private AtomicInteger atomicInteger; public Waiter(Object locker, AtomicInteger atomicInteger) { super(); this.locker = locker; this.atomicInteger = atomicInteger; } private void waitThis(){ synchronized (locker) { System.out.println("[Wait]----" + atomicInteger.addAndGet(1)); try { this.locker.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("[Wait]----" +atomicInteger.addAndGet(1)); } } public void run() { waitThis(); } } public static void main(String args[]) throws InterruptedException{ /*ExecutorService executorService = Executors.newCachedThreadPool(); executorService.execute(new NotifyAllTester.Waiter(NotifyAllTester.LOCKER)); executorService.execute(new NotifyAllTester.Waiter(NotifyAllTester.LOCKER)); executorService.execute(new NotifyAllTester.Waiter(NotifyAllTester.LOCKER)); executorService.execute(new NotifyAllTester.Waiter(NotifyAllTester.LOCKER));*/ AtomicInteger atomicInteger = new AtomicInteger(2); new NotifyAllTester.Waiter(NotifyAllTester.LOCKER,atomicInteger).start(); new NotifyAllTester.Waiter(NotifyAllTester.LOCKER,atomicInteger).start(); new NotifyAllTester.Waiter(NotifyAllTester.LOCKER,atomicInteger).start(); new NotifyAllTester.Waiter(NotifyAllTester.LOCKER,atomicInteger).start(); Thread.sleep(1000L); System.out.println(">>>>>>>>(1)"); //executorService.execute(new NotifyAllTester.Notifier(NotifyAllTester.LOCKER)); new NotifyAllTester.Notifier(NotifyAllTester.LOCKER).start(); Thread.sleep(1000L); System.out.println(">>>>>>>>(2)"); } }