重学JAVA基础(七):线程的wait、notify、notifyAll、sleep
/** * 测试thread的wait notify notifyAll sleep Interrupted * @author tomsnail * @date 2015年4月20日 下午3:20:44 */ public class Test1 { /** * 对象锁 * @author tomsnail * @date 2015年4月20日 下午3:14:13 */ private static final Object lockObject = new Object(); /** * 等待线程 * @author tomsnail * @date 2015年4月20日 下午3:14:22 */ static class Thread1 implements Runnable{ @Override public void run() { synchronized (lockObject) { try { System.out.println(Thread.currentThread().getName()+"wait start"); lockObject.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"wait end"); } } } /** * 唤醒线程 * @author tomsnail * @date 2015年4月20日 下午3:14:36 */ static class Thread2 implements Runnable{ @Override public void run() { synchronized (lockObject) { lockObject.notify(); System.out.println(Thread.currentThread().getName()+"notify"); } } } /** * 唤醒所有线程 * @author tomsnail * @date 2015年4月20日 下午3:14:51 */ static class Thread3 implements Runnable{ @Override public void run() { synchronized (lockObject) { lockObject.notifyAll(); System.out.println(Thread.currentThread().getName()+"notifyAll"); } } } /** * 睡眠线程 * @author tomsnail * @date 2015年4月20日 下午3:20:30 */ static class Thread4 implements Runnable{ @Override public void run() { try { System.out.println(Thread.currentThread().getName()+"sleep"); Thread.currentThread().sleep(20000); } catch (InterruptedException e) { System.out.println(Thread.currentThread().getName()+"Interrupted"); } } } public static void main(String[] args) { Thread t1 = new Thread(new Thread1()); Thread t3 = new Thread(new Thread1()); Thread t4 = new Thread(new Thread1()); Thread t2 = new Thread(new Thread2()); Thread t5 = new Thread(new Thread3()); //3个等待线程运行 t1.start(); t3.start(); t4.start(); try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //唤醒线程运行 t2.start(); try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //唤醒所有线程运行 t5.start(); //睡眠线程 Thread t6 = new Thread(new Thread4()); t6.start(); try { Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //睡眠线程中断 t6.interrupt(); } }
结果
Thread-0wait start Thread-2wait start Thread-1wait start Thread-3notify Thread-0wait end Thread-4notifyAll Thread-1wait end Thread-2wait end Thread-5sleep Thread-5Interrupted