執行緒間的等待喚醒機制-(一)
阿新 • • 發佈:2019-01-04
執行緒間的同步
等待喚醒機制
執行緒的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();
}
}
}
}