009 wait notify等方法
阿新 • • 發佈:2018-08-22
ren 實現 public start throw vol ati 執行順序 void
一 .概述
當我們實現了原子性操作的時候,我們又會遇到一個問題,那就是線程之間通信的問題.所謂的線程通信,指的就是線程間的執行順序是需要進行一定的控制的.
我們拿最經典的生產者和消費者模型進行說明:
private static Object lock = new Object(); private static int index = 1; private static volatile Boolean flag = true; /** * 生產者的線程 */ static class Provider { publicstatic void proIndex() { synchronized (lock) { if (!flag) { System.out.println(Thread.currentThread().getName() + "--" + index++); lock.notify(); flag = !flag; } else { try {lock.wait(); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } } /** * 消費者的線程 */ static class Consumer { public static void conIndex() { synchronized (lock) { if (flag) { System.out.println(Thread.currentThread().getName() + "--" + index); lock.notify(); flag = !flag; } else { try { lock.wait(); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } } public static void main(String[] args) throws InterruptedException { new Thread(() -> { while (true) { sleep(); Provider.proIndex(); } }).start(); new Thread(() -> { while (true) { sleep(); Consumer.conIndex(); } }).start(); } private static void sleep() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } }
在這裏,我們使用wait()和notify()方法進行實現.
但是我們發現了一個問題,如果我們實現線程之間的通訊的代價實在是太高了.
於是在並發包之中為我們提供了一系列的線程通訊的工具,這些都會在後面進行分析.
009 wait notify等方法