-1

スレッドの実行を制御できるように、文字列リテラルを同期しようとしていますが、何らかの理由で機能しません..

同期方法に問題はありますか?

package scratch1;

public class OrderedThread {
    public static void main(String[] args){
        RunThread first, second, third;
        OrderedThread orderedthread = new OrderedThread();
        first = new RunThread("One",orderedthread);
        second = new RunThread("Two",orderedthread);
        third = new RunThread("Three",orderedthread);
        second.start();
        first.start();
        third.start();
    }

    public void display(String msg){
        synchronized(msg){
            for (int i = 1; i <= 20; i++){
                System.out.println("Name = "+ msg);
            }
        }
    }

}

class RunThread extends Thread{
    String name;
    OrderedThread orderT;
    RunThread(String name, OrderedThread orderT){
        this.name = name;
        this.orderT = orderT;
    }

    public void run(){
        orderT.display(name);
    }
}
4

1 に答える 1

1

同期のポイントは、共有リソースへのアクセスです。あなたのスレッドは、他のスレッドがアクセスしようとしているオブジェクトのモニターを取得することになっています。あなたの場合、各スレッドは異なるオブジェクトのモニターを取得するため、ブロックするものはありません。

代わりにリテラル"One"をコンストラクターに渡した場合

first = new RunThread("One",orderedthread);
second = new RunThread("One",orderedthread);
third = new RunThread("One",orderedthread);

次に、実行が順番に表示されます。各スレッドは、別のスレッドを開始する前に、for ループ (synchronizedブロック内) を終了する必要があります。これは、各スレッドが同じStringオブジェクトで同期されるためです。

さらに良いことに、ロックとして機能する多くのjava.util.concurrentクラスの 1 つを使用します。たとえば、Lock.

于 2013-10-03T18:37:28.973 に答える