为什么消费者线程首先开始?

时间:2013-10-06 18:30:25

标签: java

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线程设置优先级。它不起作用。 此外,如果代码中的代码或设计缺陷存在任何其他缺陷,请提及。

2 个答案:

答案 0 :(得分:1)

synchronized (q) {

你告诉你所有的线程都不能同时运行 这违背了线程的目的。

答案 1 :(得分:0)

并行执行线程意味着它们可以按任何顺序运行。如果您希望它们以预定义的顺序运行,则必须明确编程。线程启动的顺序不是设置线程执行顺序的意思。

相关问题