なぜ出力が異なるのですか?
回答: synchronized同期化されたブロックまたはメソッドに入る前に、ロックが達成されたオブジェクトが必要です。
この場合、メソッドが実行されるオブジェクトでロックが達成されているため、スレッド1はオブジェクトth1でロックされ、スレッド2はth2でロックされます。
したがって、すべてのスレッドは異なるオブジェクトにロックされており、同時に実行することができます。
一貫した出力を得るにはどうすればよいですか?
回答
オプション1:あなたがメインスレッドに パブリッククラスMultiBasic1をスレッドに参加する参加使用することができます{
public static void main(String[] args) throws InterruptedException {
ChildThread th1=new ChildThread();
ChildThread th2= new ChildThread();
ChildThread th3= new ChildThread();
ChildThread th4= new ChildThread();
th1.setName("A");
th2.setName("B");
th3.setName("C");
th4.setName("D");
th1.start();
th1.join();
th2.start();
th2.join();
th3.start();
th3.join();
th4.start();
th4.join();
}
}
クラスChildThreadが延びスレッド{
public void run(){
for(int i=1; i<=5; i++)
System.out.println(i + " " + getName());
}
}
オプション2:スレッド
パブリッククラスMultiBasic1 {
public static void main(String[] args) throws InterruptedException {
ChildThread th1=new ChildThread();
ChildThread th2= new ChildThread();
ChildThread th3= new ChildThread();
ChildThread th4= new ChildThread();
th1.setName("A");
th2.setName("B");
th3.setName("C");
th4.setName("D");
th1.start();
th2.start();
th3.start();
th4.start();
}
}
クラスChildThreadスレッド{
private static final Object lock = new Object();
public void run(){
synchronized (lock) {
for(int i=1; i<=5; i++)
System.out.println(i + " " + getName());
}
}
}
を拡張を同期するために同期化ブロックの共有オブジェクトを提供
*「実行メソッドで一貫性のある出力を得る機会はありますか?」 - スレッドを使用せず、直接 'run'を呼び出します – MadProgrammer
@MadProgrammer直接実行した場合、マルチスレッド化のメリットは得られません。 –
一度に「実行」できるスレッドは1つだけですが、マルチスレッド化のメリットも得られません。 – user2357112