wait()
先看java doc怎麼說
wait導致當前的線程等待
例子如下
import java
import java
class Consume implements Runnable {
private List container = null;
private int count;
public Consume(List lst) {
ntainer = lst;
}
public void run() {
while(true){
synchronized (container) {
if (container
try {
System
container
System
} catch (InterruptedException e) {
e
}
}
try {
Thread
} catch (InterruptedException e) {
// TODO Auto
e
}
container
container
System
}
}
}
}
class Product implements Runnable {
private List container = null;
private int count;
public Product(List lst) {
ntainer = lst;
}
public void run() {
while(true) {
synchronized (container) {
if (container
try {
container
} catch (InterruptedException e) {
e
}
}
try {
Thread
} catch (InterruptedException e) {
e
}
container
container
System
}
}
}
}
public class MultiThread {
private List container = new ArrayList()
public final static int MAX =
public static void main(String args[]) {
MultiThread m = new MultiThread()
new Thread(new Consume(m
new Thread(new Product(m
// new Thread(new Consume(m
// new Thread(new Product(m
}
public List getContainer() {
return container;
}
public void setContainer(List container) {
ntainer = container;
}
}
++++++++++++++wait之前 //進入消費者線程
我生產了
//退出同步塊之後
我生產了
++++++++++++++wait之後 // 再次競爭
我吃了
我吃了
++++++++++++++wait之前
我生產了
++++++++++++++wait之後
我吃了
++++++++++++++wait之前
我生產了
我生產了
我生產了
++++++++++++++wait之後
我吃了
我吃了
我生產了
我生產了
我吃了
我吃了
我吃了
我生產了
我吃了
我生產了
我生產了
我吃了
我吃了
++++++++++++++wait之前
我生產了
我生產了
++++++++++++++wait之後
我吃了
我生產了
我生產了
我吃了
我生產了
我生產了
我吃了
我吃了
我生產了
我生產了
我吃了
我生產了
我生產了
我吃了
我吃了
我生產了
我生產了
我吃了
我吃了
我吃了
我生產了
我吃了
我吃了
我生產了
我吃了
我吃了
我生產了
我吃了
++++++++++++++wait之前
我生產了
我生產了
++++++++++++++wait之後
我吃了
我吃了
我生產了
我吃了
++++++++++++++wait之前
我生產了
……
可能的一種輸出結果如上所示
++++++++++++++wait之前
我生產了
我生產了
++++++++++++++wait之後
我吃了
我吃了
++++++++++++++wait之前
我生產了
++++++++++++++wait之後
notify喚醒在此對象等待隊列上等待的單個線程
調用對像wait方法後
記得線程必須重新獲得對像鎖才能繼續執行
Code
package ProductAndConsume;
import java
public class Consume implements Runnable{
private List container = null;
private int count;
public Consume(List lst){
ntainer = lst;
}
public void run() {
while(true){
synchronized (container) {
if(container
try {
container
} catch (InterruptedException e) {
e
}
}
try {
Thread
} catch (InterruptedException e) {
// TODO Auto
e
}
container
container
System
}
}
}
}
package ProductAndConsume;
import java
public class Product implements Runnable {
private List container = null;
private int count;
public Product(List lst) {
ntainer = lst;
}
public void run() {
while (true) {
synchronized (container) {
if (container
try {
container
} catch (InterruptedException e) {
e
}
}
try {
Thread
} catch (InterruptedException e) {
e
}
container
container
System
}
}
}
}
package ProductAndConsume;
import java
import java
public class MultiThread {
private List container = new ArrayList()
public final static int MAX =
public static void main(String args[]){
MultiThread m = new MultiThread()
new Thread(new Consume(m
new Thread(new Product(m
new Thread(new Consume(m
new Thread(new Product(m
}
public List getContainer() {
return container;
}
public void setContainer(List container) {
ntainer = container;
}
這兩個方法應該都比較熟悉
二
這個關鍵字用於保護共享數據
以下是引用片段
public ThreadTest implements Runnable
{
public synchronized void run(){
for(int i=
{
System
}
}
public static void main(String[] args)
{
Runnable r
Runnable r
Thread t
Thread t
t
t
}
}
以上這段程序中的 i 變量並不是共享數據
當把代碼改成如下
以下是引用片段
Runnable r = new ThreadTest()
Thread t
Thread t
t
t
三
使當前線程(即調用該方法的線程)暫停執行一段時間
比如有兩個線程同時執行(沒有Synchronized)
總之
四
join()方法使調用該方法的線程在此之前執行完畢
五
它與sleep()類似
六
這三個方法用於協調多個線程對共享數據的存取
wait()方法使當前線程暫停執行並釋放對象鎖標志
鎖標志等待池中的線程能夠獲取鎖標志
notifyAll()則從對象等待池中移走所有等待那個對象的線程並放到鎖標志等待池中
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27303.html