1. 程式人生 > >執行緒間的等待喚醒機制-(一)

執行緒間的等待喚醒機制-(一)

執行緒間的同步

等待喚醒機制

執行緒的wait()方法使用就是放棄了執行資格
等待的執行緒都存線上程池當中。
方法:只能在現場同步當中使用。下面的方法必須強調監視器

wait();// 可以是當前執行緒進行等待
notify();// 喚醒操作的執行緒
notifyAll(); //喚醒所有執行緒。

當前執行緒必須擁有此物件監視器。該執行緒釋出對此監視器的所有權並等待,直到其他執行緒通過呼叫 notify 方法,或 notifyAll 方法通知在此物件的監視器上等待的執行緒醒來。然後該執行緒將等到重新獲得對監視器的所有權後才能繼續執行. 其實就是當前執行緒鎖

練習程式碼:

執行緒間的喚醒機制

package com.thread.text;

public class thradDay2
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        Res res = new Res();

        // 現在我要給他
        Thread th1 = new Thread(new Input(res));
        Thread th2 = new Thread(new Output(res));

        th1.start();
        th2.start();
    }

}

class Res
{
    String name;
    String sex;
    boolean
waitT = false; // 賦值函式 public synchronized void set(String name, String sex) { if (waitT) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } this
.name = name; this.sex = sex; this.waitT = true; this.notify(); } /** * 列印函式 */ public synchronized void out() { if (!waitT) { try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(this.name + ">........>" + this.sex); this.waitT = false; this.notify(); } } /* * 用於輸入的類 */ class Input implements Runnable { private Res res; int x = 0; public Input(Res res) { this.res = res; } public void run() { while (true) { // 注意這裡加的鎖。是Output類的位元組碼。這樣可以實現執行緒間的同步 synchronized (res) { if (x == 0) { res.set("zhulang", "nan"); } else { res.set("朱浪", "女"); } x = (x + 1) % 2; res.waitT = true; res.notify(); // 賦值結束就要喚醒當前執行緒 } } } } /* * 用於輸出的類 */ class Output implements Runnable { private Res res; public Output(Res res) { this.res = res; } public void run() { while (true) { synchronized (res) { res.out(); } } } }