/*
编写程序.生产者每隔100ms生产一个0~9之间的一个数,保存在一个MyNumber类型的对象中,并显示出来.
只要这个MyNumber对象中保存了新的数字(意思就是只要与之前保存的那个数不相同就打印出来,
相同的就继续随机生成直到不相同时就输出),消费者就将其取出来并显示.
*/
class Producer implements Runnable
{
MyNumber number;
int num;
Producer(MyNumber my)
{
number=my;
}
public void run()
{
for(int i=0;i<10;i++)
{
num=(int)(Math.random()*9);
number.push(num);
try
{
Thread.sleep(100);
}
catch(InterruptedException e){}
}
}
}
class Consumer implements Runnable
{
MyNumber number;
int num;
Consumer(MyNumber my)
{
number=my;
}
public void run()
{
for(int i=0;i<10;i++)
{
num=number.get();
System.out.println(num);
try
{
Thread.sleep(100);
}
catch(Exception e){}
}
}
}class MyNumber
{
int num;
int i=100;
public synchronized void push(int i)
{
num=i;
notify();
}
public synchronized int get()
{
while(num==i)
{
try
{
wait();
}
catch(InterruptedException e){}
}
i=num;
return num;
}
}public class Ex9
{
public static void main(String[] args)
{
MyNumber number=new MyNumber();
Producer p=new Producer(number);
Consumer c=new Consumer(number);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}
以上代码我只是循环10次..每次循环都生成一个随机数(0~9)的..
问题就出在我输出随机数那个线程那里,因为如果生成一个数字跟上一个生成的一样的话就不输出(这里会 wait() 一下),重新回去生成一个,所以如果在第10次循环的是跟上一个一样的话,就 wait() 了..而生成随机数那个线程又循环完了..那么就一直 wait() 下去..有没有解决方法.? 或希望有高手可以重写一下代码. :)ps:表达能力不好,希望大家能将就点吧...
编写程序.生产者每隔100ms生产一个0~9之间的一个数,保存在一个MyNumber类型的对象中,并显示出来.
只要这个MyNumber对象中保存了新的数字(意思就是只要与之前保存的那个数不相同就打印出来,
相同的就继续随机生成直到不相同时就输出),消费者就将其取出来并显示.
*/
class Producer implements Runnable
{
MyNumber number;
int num;
Producer(MyNumber my)
{
number=my;
}
public void run()
{
for(int i=0;i<10;i++)
{
num=(int)(Math.random()*9);
number.push(num);
try
{
Thread.sleep(100);
}
catch(InterruptedException e){}
}
}
}
class Consumer implements Runnable
{
MyNumber number;
int num;
Consumer(MyNumber my)
{
number=my;
}
public void run()
{
for(int i=0;i<10;i++)
{
num=number.get();
System.out.println(num);
try
{
Thread.sleep(100);
}
catch(Exception e){}
}
}
}class MyNumber
{
int num;
int i=100;
public synchronized void push(int i)
{
num=i;
notify();
}
public synchronized int get()
{
while(num==i)
{
try
{
wait();
}
catch(InterruptedException e){}
}
i=num;
return num;
}
}public class Ex9
{
public static void main(String[] args)
{
MyNumber number=new MyNumber();
Producer p=new Producer(number);
Consumer c=new Consumer(number);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}
以上代码我只是循环10次..每次循环都生成一个随机数(0~9)的..
问题就出在我输出随机数那个线程那里,因为如果生成一个数字跟上一个生成的一样的话就不输出(这里会 wait() 一下),重新回去生成一个,所以如果在第10次循环的是跟上一个一样的话,就 wait() 了..而生成随机数那个线程又循环完了..那么就一直 wait() 下去..有没有解决方法.? 或希望有高手可以重写一下代码. :)ps:表达能力不好,希望大家能将就点吧...
题目的意思我上次没说好..不好意思..
MyNumber number;
int num;
// 增加一个Vector
Vector<Integer> nums =
new Vector<Integer>();
Producer(MyNumber my) {
number=my;
// 赋值
for (int i=0; i<10; i++) {
nums.add(i);
}
}
public void run() {
for(int i=0;i<10;i++) { // 注意nums.size()
int pos = (int)(Math.random() * nums.size());
num = nums.get(pos);
// 去掉已赋的值
nums.remove(pos);
number.push(num); try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
}
}
{
MyNumber number;
int num;
Producer(MyNumber number){
this.number = number;
}
public void run(){
for(int i=0;i<10;i++){
num=(int)(Math.random()*10);
number.push(num);
try{
Thread.sleep(500);
}catch(InterruptedException e){}
}
}
}
class Consumer implements Runnable{
MyNumber number;
int num;
Consumer(MyNumber number){
this.number=number;
}
public void run(){
for(int i=0;i<10;i++){
num=number.get();
System.out.println(num);
}
}
}class MyNumber {
int num;
boolean empty=true; public synchronized void push(int num){
if(empty==false)
try{
wait();
}catch(Exception e){}
this.num=num;
empty = false;
notify();
}
public synchronized int get(){
if(empty==true)
try{
wait();
}catch(InterruptedException e){}
empty = true;
notify();
return num;
}
}public class Ex9{
public static void main(String[] args){
MyNumber number=new MyNumber();
Producer p=new Producer(number);
Consumer c=new Consumer(number);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}