3

1 つのスレッドが「Hello」を出力し、別のスレッドが「World」を出力するとします。次のように、一度は成功しました。

public class InterThread {

    public static void main(String[] args) {
        MyThread mt=new MyThread();
        mt.start();
        synchronized(mt){
            System.out.println("Hello");
            try {
                mt.wait();
                i++;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}

class MyThread extends Thread{

    public void run(){
        synchronized(this){
        System.out.println("World!");
        notify();
        }
    }
}

複数回の印刷、たとえば 5 回の印刷を行うにはどうすればよいですか。同期ブロックの周りに for ループを入れてみましたが、役に立ちませんでした。

4

7 に答える 7

3

ここでの目標は、スレッドを同期して、一方が完了すると他方に通知することです。私がそれをしなければならない場合、それは異なるデータで同じコードを実行する2つのスレッドになります. 各スレッドは独自のデータ ("Hello"およびtrueT1 へ、"World"およびfalset2 へ) を持ち、変数turnと個別のロック オブジェクトを共有します。

while(/* I need to play*/){
  synchronized(lock){
    if(turn == myturn){
      System.out.println(mymessage);
      turn = !turn; //switch turns
      lock.signal();
     }
     else{
       lock.wait();
     }
  }
}
于 2013-06-06T13:43:36.140 に答える
0

2 つのスレッドがあり、どちらも独自のデータ ("Hello" と ht に true、"World" と wt に false) を持ち、変数 objturn を共有します。

public class HelloWorldBy2Thread {  
    public static void main(String[] args) {
        PrintHelloWorld hw = new PrintHelloWorld(); 
        HelloThread ht = new HelloThread(hw);
        WorldThread wt = new WorldThread(hw);
        ht.start();
        wt.start();
    }
}
public class HelloThread extends Thread {   
    private PrintHelloWorld phw;
    private String hello;
    public HelloThread(PrintHelloWorld hw) {
        phw = hw;
        hello = "Hello";
    }   
    @Override
    public void run(){
        for(int i=0;i<10;i++)
            phw.print(hello,true);
    }
}
public class WorldThread extends Thread {
    private PrintHelloWorld phw;
    private String world;
    public WorldThread(PrintHelloWorld hw) {
        phw = hw;
        world = "World";
    }
    @Override
    public void run(){
        for(int i=0;i<10;i++)
            phw.print(world,false);
    }
}
public class PrintHelloWorld {  
    private boolean objturn=true;
    public synchronized void print(String str, boolean thturn){
        while(objturn != thturn){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(str+" ");
        objturn = ! thturn;
        notify();               
    }
}
于 2016-07-25T16:52:33.613 に答える