请高手帮我看一个有关多线程同步的问题
大家好,本贴转自www.java-cn.com上面的,由于问题有点棘手,所以上这里请大家帮忙解答一下!这是我第一次来这里提问,希望大家帮忙,我一定在线(上班)的时候关注此问题,并及时给分。
原贴是:
http://www.java-cn.com/bbs-jsp/show.jsp?id=28967&forum=advanced
现在我有两点问题:
1.当有两个以上的线程同步运行的时候,为什么一定要把 if 改成 while
2.最好是将notify函数改用notifyAll() 代替(我试了一下,好像都可以用的啊)。
代码如下:
package chapter3;
/**
* @author cherry 两个线程用作Producer,一个线程用作Consumer
* This version is 2.0 , proposed by 小狗子
* Date : 2007.4.4
*/
public class Chapter3 {
public static void main(String[] args) {
NewThread a, b, c, d;
Q q = new Q();
a = new NewThread( "1st producer ", true, q);// Producer 1
b = new NewThread( "2nd producer ", true, q);// Producer 2
c = new NewThread( "3rd producer ", true, q);// Producer 3
d = new NewThread( "1st consumer ", false, q);// Consumer
Thread t = Thread.currentThread();
t.setName( "Main thread ");
System.out.println(t.getName() + " is starting... ");
try {
a.t.join();
b.t.join();
c.t.join();
d.t.join();
System.out.println( "main thread is exiting.......... ");
} catch (InterruptedException e) {
System.out.println( "error occurs " + e.getMessage());
} finally {
}
}
}
/**
* @author cherry Class Q is used to implement comsumer and producer
*/
class Q {
private static int counter = 0;
synchronized void addCounter(String threadName) {
// must use while condition here,instead of if condition
while (counter > = 10) {// 生成过剩就等待
try {
System.out.println(threadName + " add is waiting ");
wait();
} catch (InterruptedException e) {
System.out.println( "wait error! ");
}
}
counter += 1;
notifyAll();// use notify() seems also right here
System.out.println( "add counter: " + counter);
}
synchronized void minCounter(String threadName) {
// must use while condition here,instead of if condition
while (counter == 0) {// 消费过渡就等待
try {
System.out.println(threadName + " minus is waiting ");
wait();