package ProducerConsumer;
public class Queue {
int item;
boolean isEmpty=false;
public int put(int item)
{
this.item=item;
return this.item;
}
public int get()
{
return item;
}
}
package ProducerConsumer;
public class Producer extends Thread{
Queue q;
public Producer(Queue q)
{
this.q=q;
}
@Override
public void run() {
synchronized (q) {
for(int i=1;i<=5;i++)
{
if(q.isEmpty==false)
try {
q.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Producer produced = "+q.put(i));
q.isEmpty=false;
q.notify();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
包ProducerConsumer;
public class Consumer extends Thread {
Queue q;
public Consumer(Queue q)
{
this.q=q;
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (q) {
for(int i=1;i<=5;i++)
{
if(q.isEmpty==true)
try {
q.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("ITEM CONSUMED:"+q.get());
q.isEmpty=true;
q.notify();
}
}
}
}
包ProducerConsumer;
public class MainApp {
public static void main(String[] args)
{
Queue q=new Queue();
Thread t1=new Thread(new Producer(q));
//t1.setPriority(1);
t1.start();
Thread t2=new Thread(new Consumer(q));
t2.start();
}
}
这是我的输出:
ITEM CONSUMED:0
Producer produced = 1
ITEM CONSUMED:1
Producer produced = 2
ITEM CONSUMED:2
Producer produced = 3
ITEM CONSUMED:3
Producer produced = 4
ITEM CONSUMED:4
Producer produced = 5
问题是:为什么我的消费者线程首先运行?我也试过为我的Producer线程设置优先级。它不起作用。 此外,如果代码中的代码或设计缺陷存在任何其他缺陷,请提及。
答案 0 :(得分:1)
synchronized (q) {
你告诉你所有的线程都不能同时运行 这违背了线程的目的。
答案 1 :(得分:0)
并行执行线程意味着它们可以按任何顺序运行。如果您希望它们以预定义的顺序运行,则必须明确编程。线程启动的顺序不是设置线程执行顺序的意思。