题目:
编写程序.生产者每隔100ms生产一个0~9之间的一个数,保存在一个MyNumber类型的对象中,并显示出来.
只要这个MyNumber对象中保存了新的数字,消费者就将其取出来并显示.
class Producer implements Runnable
{
MyNumber number=new MyNumber();
int num;
Producer(MyNumber my)
{
number=my;
}
public void run()
{
for(int i=1;i<11;i++)
{
num=(int)(Math.random()*9);
number.push(num);
try
{
Thread.sleep(100);
}
catch(InterruptedException e){}
}
}
}
class Consumer implements Runnable
{
MyNumber number=new MyNumber();
int num;
Consumer(MyNumber my)
{
number=my;
}
public void run()
{
for(int i=1;i<11;i++)
{
num=number.get();
System.out.println(num);
try
{
Thread.sleep(100);
}
catch(Exception e){}
}
}
}class MyNumber
{
int num;
int i=10;
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个数之前会停止打印了..不知道为什么..光标就一直在闪.又没有出现那句"Press any key..."那话.,请大家指点下..
最好希望有朋友可以写出正确的代码..谢谢..
编写程序.生产者每隔100ms生产一个0~9之间的一个数,保存在一个MyNumber类型的对象中,并显示出来.
只要这个MyNumber对象中保存了新的数字,消费者就将其取出来并显示.
class Producer implements Runnable
{
MyNumber number=new MyNumber();
int num;
Producer(MyNumber my)
{
number=my;
}
public void run()
{
for(int i=1;i<11;i++)
{
num=(int)(Math.random()*9);
number.push(num);
try
{
Thread.sleep(100);
}
catch(InterruptedException e){}
}
}
}
class Consumer implements Runnable
{
MyNumber number=new MyNumber();
int num;
Consumer(MyNumber my)
{
number=my;
}
public void run()
{
for(int i=1;i<11;i++)
{
num=number.get();
System.out.println(num);
try
{
Thread.sleep(100);
}
catch(Exception e){}
}
}
}class MyNumber
{
int num;
int i=10;
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个数之前会停止打印了..不知道为什么..光标就一直在闪.又没有出现那句"Press any key..."那话.,请大家指点下..
最好希望有朋友可以写出正确的代码..谢谢..
它本来就是循环10次
你又没写相应的代码,怎么会出现“Press any key”呢?
//因为在Construct中把另外的引用给给number,所以此处不需初始化。
//MyNumber number = new MyNumber();
MyNumber number;
// 局部变量即可
//int num; Producer(MyNumber my) {
number = my;
} public void run() { // 习惯上,计数从0开始
//for (int i = 1; i < 11; i++) {
for (int i = 0; i<Ex9.count; i++) {
int num = (int) (Math.random() * 9);
number.push(num); try {
//100太长,超过我能忍耐的程度
//Thread.sleep(100);
Thread.sleep(50);
} catch (InterruptedException e) {
}
}
}
}class Consumer implements Runnable {
//MyNumber number = new MyNumber();
MyNumber number; //int num; Consumer(MyNumber my) {
number = my;
} public void run() {
//for (int i = 1; i < 11; i++) {
for (int i = 0; i<Ex9.count; i++) {
int num = number.get();
System.out.println(num); try {
Thread.sleep(50);
} catch (Exception e) {
}
}
}
}class MyNumber {
int num;
boolean isRaw; int i = 10; public synchronized void push(int i) {
// 如果上次产生的数没有被读出,等待
while (isRaw) {
try {
wait();
} catch (InterruptedException e) {
}
} isRaw = true;
num = i;
notify();
} public synchronized int get() {
// 你的数字是由Producer随机产生的,两次生成相同数值的情况是存在的
// 所以不能使用这中方法判断是否有新值。
//while(num==i) {
while (!isRaw) {
try {
wait();
} catch (InterruptedException e) {
}
} //i = num;
isRaw = false;
return num;
}
}public class Ex9 {
// 统一循环次数
static int count = 10; 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();
}
}