线程怎么乱了,求大家帮我编译运行一下

永生天地 2005-12-20 05:34:52
public class ProducerConsumerTest1{
public static void main(String[] args) {
CubbyHole c = new CubbyHole( ); //store number
Producer p1 = new Producer( c, 1 ); //put number
Consumer c1 = new Consumer( c, 1 ); //get number
p1.start( );
c1.start( );
}
}
class Consumer extends Thread{
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number; //consumer Num
}
public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get( ) ;
System.out.println("Consumer #"+this.number
+ " got: " + value);
}
}
}

class Producer extends Thread{
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number){
cubbyhole = c;
this.number = number; //producer Num
}
public void run( ){ //override the run method
for (int i = 0; i < 10; i++) {
cubbyhole.put( i ); //put i into CubbyHole
System.out.println("Producer #"+this.number
+ " put: " + i);
try {
sleep((int)(Math.random() * 100));
}catch (InterruptedException e) { }
}
}
}

class CubbyHole{
private int contents;
private boolean available = false;
//define get() method used by consumer
public synchronized int get(){ //lock an Object
while (available == false){
try {
wait(); // wait for Producer to put value
} catch (InterruptedException e) { }
}
available = false;
notifyAll();// notify Producer that value has been retrieved
return contents; //return the value to consumer
} // unlock an Object

//define put() method used by producer
public synchronized void put(int value){ // lock an Object
while (available == true) {
try {
wait(); // wait for Consumer to get value
} catch (InterruptedException e) { }
}
contents = value; //put the value
available = true;
notifyAll(); // notify Consumer that value has been set
} // unlock an Object
}

运行结果: 我倒了
Producer #1 put: 0
Consumer #1 got: 0
Consumer #1 got: 1
Producer #1 put: 1
Consumer #1 got: 2
Producer #1 put: 2
Consumer #1 got: 3
Producer #1 put: 3
Producer #1 put: 4
Consumer #1 got: 4
Consumer #1 got: 5
Producer #1 put: 5
Consumer #1 got: 6
Producer #1 put: 6
Consumer #1 got: 7
Producer #1 put: 7
Consumer #1 got: 8
Producer #1 put: 8
Producer #1 put: 9
Consumer #1 got: 9
Press any key to continue...
...全文
249 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuzl32 2005-12-20
  • 打赏
  • 举报
回复
拿这个函数来说明一下:
public synchronized int get(){
while (available == false){
try {
wait();
} catch (InterruptedException e) { }
}
available = false;
notifyAll();
return contents; // 这边未返回,上面的notifyAll()却激活了Producer去put.
}

在put函数中同样道理
yuzl32 2005-12-20
  • 打赏
  • 举报
回复
public class ProducerConsumerTest1{
public static void main(String[] args) {
CubbyHole c = new CubbyHole( ); //store number
Producer p1 = new Producer( c, 1 ); //put number
Consumer c1 = new Consumer( c, 1 ); //get number
p1.start( );
c1.start( );
}
}
class Consumer extends Thread{
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number; //consumer Num
}
public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get( ) ;
System.out.println("Consumer #"+this.number
+ " got: " + value);
}
}
}

class Producer extends Thread{
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number){
cubbyhole = c;
this.number = number; //producer Num
}
public void run( ){ //override the run method
for (int i = 0; i < 10; i++) {
cubbyhole.put( i ); //put i into CubbyHole
System.out.println("Producer #"+this.number
+ " put: " + i);
try {
sleep((int)(Math.random() * 100));
}catch (InterruptedException e) { }
}
}
}

class CubbyHole{
private int contents;
private boolean available = false;
//define get() method used by consumer
public synchronized int get(){ //lock an Object
while (available == false){
try {
notify();// notify Producer that value has been retrieved
wait(); // wait for Producer to put value
} catch (InterruptedException e) { }
}



available = false;
return contents; //return the value to consumer
} // unlock an Object

//define put() method used by producer
public synchronized void put(int value){ // lock an Object
while (available == true) {
try {
notify(); // notify Consumer that value has been set
wait(); // wait for Consumer to get value
} catch (InterruptedException e) { }
}
contents = value; //put the value
available = true;

} // unlock an Object
}

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧