日期:2014-05-20  浏览次数:20728 次

java线程的一个题(菜鸟求助)
package thread;

public class Test {
public static void main(String[] args) {
Queue q=new Queue();
Producer p=new Producer(q);
Consumer c=new Consumer(q);
p.start();
c.start();
}

}
class Producer extends Thread{
Queue q;
public Producer(Queue q) {
this.q=q;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Producer put:"+i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}
}
class Consumer extends Thread{
Queue q;
Consumer(Queue q){
this.q=q;
}
@Override
public void run() {
while (true){
System.out.println("Consumer get:"+q.get());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Queue{
int value;
public void put(int i){
this.value=i;

}
public int get(){
return value;
}

}


我都让Producer线程睡眠那么久了 
搞不懂为什么Consumer线程的get 一直是0?顺便求前辈们说一下 wait 和notify的用法 调用的时候 必须要显示用this 或者引用变量 .  来调用么··我看孙鑫老师的视频 没有加 直接用的wait 和notify
java??多线程?线程安全

------解决方案--------------------
class Producer extends Thread{     Queue q;     public Producer(Queue q) {         this.q=q;     }     @Override    public void run() {             for (int i = 0; i < 10; i++) {                 System.out.println("Producer put:"+i);                 try {                     Thread.sleep(500);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }                   } } 
看你生产者的代码,哪里有给Queue的q添加值了呢? 

------解决方案--------------------
在Producer里面没有调用Queue类里面的put方法。取出来的肯定是0.
------解决方案--------------------
第21行有问题,     System.out.println("Producer put:"+i);   没有给put()值进去。还有就是即使你这个put()值进去了,你没有对线程进行安全控制访问,会出现线程安全问题的