-2

私のプログラムの分析は実行されますが、そのようには起こっていません::

- main メソッドに Child1 と Child2 という 2 つのスレッドを作成しました。

-その後、両方のスレッドが開始されました

-Child1 は別のスレッドとして run() メソッドに入り、同期ブロックに入り、1 を出力して、wait メソッドが呼び出されたためにスリープします。

-Child2 は別のスレッドとして run() メソッドに入り、同期ブロックに入り、1 を出力して、Child1 がウェイクアップすることを通知します。

-このプロセスは 5 まで続きます

package multi_threading;

public class inter_thread implements Runnable {
    static inter_thread obj;
    boolean val=false;
    Thread t;

    public inter_thread(){}
    public inter_thread(String msg){
        t=new Thread(obj,msg);
        t.start();
    }
    public static void main(String args[]){
        obj=new inter_thread();
        inter_thread obj1=new inter_thread("Child1"); 
        inter_thread obj2=new inter_thread("Child2");
        try{
            obj1.t.join();
            obj2.t.join();
        }catch(InterruptedException e){
            System.out.println("Interrupted");
        }
    }

    public void run(){
        int i;
        synchronized(obj){
        for(i=1;i<=5;i++){
            System.out.println(i);
            val=!val;
            while(val)
                try{
                    wait();
                }catch(InterruptedException e){
                    System.out.println("Interrupted");
            }
            notify();
        }
     }
    }

}

マルチスレッドを使用して、このような出力を表示したい::

1
1
2
2
3
3
4
4
5
5

出力::

1
1
2

何が問題なのか教えてください。

EDIT2::前のコードを編集しました

4

2 に答える 2

0

-各スレッドにはobjのコピーがあるため、取得したばかりです

1
1
2

出力として

-- スレッド Child1 と Child2 でオブジェクトを共有するようにプログラムを修正しました。

package multi_threading;

 public class inter_thread {
    Thread t;
    public inter_thread(test_value obj,String msg){
        t=new Thread(obj,msg);
        t.start();
    }

}

 class test_value implements Runnable{
     boolean val=false;
    public static void main(String args[]){
        test_value obj=new test_value();
        inter_thread obj1=new inter_thread(obj,"Child1"); 
        inter_thread obj2=new inter_thread(obj,"Child2");
        try{
            obj1.t.join();
            obj2.t.join();
        }catch(InterruptedException e){
            System.out.println("Interrupted");
        }
    }
    public void run(){
        int i;
        synchronized(obj){
        for(i=1;i<=5;i++){
            System.out.println(i);
            obj.val=!obj.val;
            while(obj.val)
                try{
                    wait();
                }catch(InterruptedException e){
                    System.out.println("Interrupted");
                }
               notify();
           }
       }
    }
 }

-obj を解決できないというコンパイル エラーが発生します。

-スレッド間で obj を共有する方法と、以下のように出力を生成する方法:

1
1
2
2
3
3
4
4
5
5
于 2013-11-06T15:28:09.433 に答える
0

Thread t;初期化されていません。

System.out.println(t.getName()+" has "+i);// ここで例外が発生します

于 2013-11-05T15:34:14.767 に答える