1. 程式人生 > >009 wait notify等方法

009 wait notify等方法

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 {

        public
static 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等方法