JAvaマルチスレッド:循環出力ABC
4122 ワード
JAvaマルチスレッドの古典的な問題:問題:A,B,Cの3つのスレッドがあり、Aスレッド出力A,Bスレッド出力B,Cスレッド出力Cがあり、要求は同時に3つのスレッドを起動し、ABCを順番に出力し、10回循環する.
まずテストクラスを書き出します
ここで、a,b,cは、それぞれ3つのスレッドに対応するオブジェクトを表す.Runnableインタフェースを実装するクラスを書き換える
結果;ABCABCABCABCABCABCABCABCABCABC
結果分析:3つのオブジェクトa b c 1がある.まず、スレッド1が実行終了後、a.notify()が実行されてスレッド2が起動し、c.wait()が実行されてスレッド1が待機しているため、whileは1回しか実行されず、誰かがcを起動してから実行を継続する必要がある.2.その後、スレッド2が起動されたため、b.notify()が実行され、スレッド3が起動され、a.wait()が実行されてスレッド2が待機しているため、whileは1回しか実行されず、誰かがaを起動してから実行を継続する必要がある.3..その後、スレッド3が起動されたため、c.notify()が実行され、スレッド1が起動され、b.wait()が実行され、スレッド3が待機しているため、whileは1回しか実行されず、誰かがbを起動してから実行を継続する必要がある.なお、スレッド1ではc.wait()が実行されているが、スレッド1が待機状態となり、waitがオブジェクトロックを解放することにより、スレッド3においてcのオブジェクトロック(文:synchronized(now))が得られる.
まずテストクラスを書き出します
public class Main {
public static void main(String[] args) throws Exception{
Object a=new Object();
Object b=new Object();
Object c=new Object();
Mythread my1=new Mythread("A",c,a);
Mythread my2=new Mythread("B",a,b);
Mythread my3=new Mythread("C",b,c);
Thread thread1=new Thread(my1);
Thread thread2=new Thread(my2);
Thread thread3=new Thread(my3);
thread1.start();
Thread.sleep(1000);
thread2.start();
Thread.sleep(1000);
thread3.start();
Thread.sleep(1000);
}
}
ここで、a,b,cは、それぞれ3つのスレッドに対応するオブジェクトを表す.Runnableインタフェースを実装するクラスを書き換える
public class Mythread implements Runnable{
private String name="";
private Object pre;//
private Object now;//
public Mythread(String name,Object pre,Object now){
this.name=name;
this.pre=pre;
this.now=now;
}
@Override
public void run(){
int count=10;
while(count>0){
count--;
synchronized(pre){
synchronized(now){
System.out.println(name);
now.notify();//
}
try {
pre.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
結果;ABCABCABCABCABCABCABCABCABCABC
結果分析:3つのオブジェクトa b c 1がある.まず、スレッド1が実行終了後、a.notify()が実行されてスレッド2が起動し、c.wait()が実行されてスレッド1が待機しているため、whileは1回しか実行されず、誰かがcを起動してから実行を継続する必要がある.2.その後、スレッド2が起動されたため、b.notify()が実行され、スレッド3が起動され、a.wait()が実行されてスレッド2が待機しているため、whileは1回しか実行されず、誰かがaを起動してから実行を継続する必要がある.3..その後、スレッド3が起動されたため、c.notify()が実行され、スレッド1が起動され、b.wait()が実行され、スレッド3が待機しているため、whileは1回しか実行されず、誰かがbを起動してから実行を継続する必要がある.なお、スレッド1ではc.wait()が実行されているが、スレッド1が待機状態となり、waitがオブジェクトロックを解放することにより、スレッド3においてcのオブジェクトロック(文:synchronized(now))が得られる.