0
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 スレッドの優先順位も設定してみました。動いていない。また、コードに他の欠陥やコードの設計上の欠陥がある場合は、言及してください。

4

2 に答える 2

1
synchronized (q) {

すべてのスレッドを同時に実行しないように指示しました。
それはスレッドの目的を無効にします。

于 2013-10-06T18:31:54.247 に答える
0

スレッドの並列実行は、スレッドが任意の順序で実行できることを意味します。定義済みの順序で実行する場合は、明示的にプログラムする必要があります。スレッドの開始順序は、スレッドの実行順序を設定することを意味するものではありません。

于 2013-10-06T19:47:22.883 に答える