在Java多線程語句中有很多的小的語句需要我們特殊的注意。 wait(),notify(),notifyAll()不屬於Thread類,下面我們就來詳細的看看如何使用這幾個分類代碼。希望大家有所收獲。
而是屬於Object基礎類,也就是說每個對像都有wait(),notify(),notifyAll()的功能.因為都個對像都有鎖,鎖是每個對像的基礎,當然操作鎖的方法也是最基礎了.先看Java doc怎麼說:
Java多線程語句中,wait導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。當前的線程必須擁有此對象監視器。該線程發布對此監視器的所有權並等待,直到其他線程通過調用 notify 方法,或 notifyAll 方法通知在此對象的監視器上等待的線程醒來。然後該線程將等到重新獲得對監視器的所有權後才能繼續執行.
notify喚醒在此對象監視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程。直到當前的線程放棄此對象上的鎖定,才能繼續執行被喚醒的線程。此方法只應由作為此對象監視器的所有者的線程來調用.
"當前的線程必須擁有此對象監視器"與"此方法只應由作為此對象監視器的所有者的線程來調用"說明wait方法與notify方法必須在同步塊內執行,即synchronized(obj之內).
調用對像wait方法後,當前線程釋放對像鎖,進入等待狀態.直到其他線程(也只能是其他線程)通過notify 方法,或 notifyAll.該線程重新獲得對像鎖。繼續執行,記得線程必須重新獲得對像鎖才能繼續執行.因為synchronized代碼塊內沒有鎖是寸步不能走的.看一個很經典的例子:
1.Code
2.package ProductAndConsume;
3.import Java.util.List;
4.public class Consume implements Runnable{
5.private List container = null;
6.private int count;
7.public Consume(List lst){
8.this.container = lst;
9.}
10.public void run() {
11.while(true){
12.synchronized (container) {
13.if(container.size()== 0){
14.try {
15.container.wait();//放棄鎖
16.} catch (InterruptedException e) {
17.e.printStackTrace();
18.}
19.}
20.try {
21.Thread.sleep(100);
22.} catch (InterruptedException e) {
23.// TODO Auto-generated catch block
24.e.printStackTrace();
25.}
26.container.remove(0);
27.container.notify();
28.System.out.println("我吃了"+(++count)+"個");
29.}
30.}
31.}
32.}
33.package ProductAndConsume;
34.import Java.util.List;
35.public class Product implements Runnable {
36.private List container = null;
37.private int count;
38.public Product(List lst) {
39.this.container = lst;
40.}
41.public void run() {
42.while (true) {
43.synchronized (container) {
44.if (container.size() > MultiThread.MAX) {
45.try {
46.container.wait();
47.} catch (InterruptedException e) {
48.e.printStackTrace();
49.}
50.}
51.try {
52.Thread.sleep(100);
53.} catch (InterruptedException e) {
54.e.printStackTrace();
55.}
56.container.add(new Object());
57.container.notify();
58.System.out.println("我生產了"+(++count)+"個");
59.}
60.}
61.}
62.}
63.package ProductAndConsume;
64.imort Java.util.ArrayList;
65.import Java.util.List;
66.public class MultiThread {
67.private List container = new ArrayList();
68.public final static int MAX = 5;
69.public static void main(String args[]){
70.MultiThread m = new MultiThread();
71.new Thread(new Consume(m.getContainer())).start();
72.new Thread(new Product(m.getContainer())).start();
73.new Thread(new Consume(m.getContainer())).start();
74.new Thread(new Product(m.getContainer())).start();
75.}
76.public List getContainer() {
77.return container;
78.}
79.public void setContainer(List container) {
80.this.container = container;
81.}
以上就是對Java多線程語句的詳細介紹。