1. 程式人生 > >010 線程通信

010 線程通信

信號 rod 一個 cep HR lee tile ola sleep

一 . 概念

  我們使用多個線程的時候,我們需要線程運行之間按照一定的順序運行下去,這個就需要線程之間的通信.


二 .例子

  我們使用經典的生產者和消費者模式演示一下.

public class ProductAndConsume {
    private static Object lock = new Object();
    private volatile static int count = 0;
    private static volatile boolean flag = false;

    public static void product()  {
            synchronized (
lock) { try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } if (!flag) { System.out.println("我生產了第" + (++count) + "個產品"); try
{ //放入等待池中 flag = true ; lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void consume() { synchronized (
lock) { try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } if (flag) { // 有產品 System.out.println("我消費了第" + count + "個產品"); flag = false; lock.notify(); } } } public static void main(String[] args) { new Thread("product") { @Override public void run() { for(;;) product(); }; }.start(); new Thread("consume") { @Override public void run() { for(;;) consume(); }; }.start(); } }

我們創建了兩個線程,一個生產產品,另外一個線程消費產品.

我們使用了wait()方法和notify()方法發送信號量,實現線程之間的同步.


三 .分析

[1]首先需要說明的就是我們的wait和notify都需要在同步代碼塊(同步方法之中運行).

[2]wait()方法的含義是:

    放棄當前持有的鎖,,進入到鎖池中,等待被喚醒.

[3]notify()方法的含義是:

    在當前的鎖池中喚醒一個線程.

010 線程通信