-1
public abstract class Multithread implements Runnable{
    static Thread t1 = new Thread(){
        public  synchronized void run(){
            try {
                for(;;){
                    System.out.println("java");
                    t1.sleep(300);
                }
            } catch (Exception e) {
                System.out.println("Exception"+e);
            }
        }
    };
    static Thread t2 = new Thread(){
        public  synchronized void  run(){
            try{
                for(;;){
                    System.out.println("world");
                    t2.sleep(300);
                }
            }catch(Exception e){
                System.out.println("Exception"+e);
            }
        }
    };
    public static void main(String[] args) {
        try{
            t1.start();
            t2.start();
        }catch(Exception e){
            System.out.println("Exception "+e);
        }
    }
    @Override
    public void run() {
        System.out.println("running");
    }
}

例外的な O/P:

java
world
java
world
java
world
.
.
.
.

スレッドに sleep() を使用してみ ましたが、このようにある時点でオーバーラップしています-

java
java
world
java
world
world 
java 
..

これら2つのスレッドを並行して実行する必要があり、重複してはならず、どちらのスレッドも開始できると予想されます。何か案が?

4

3 に答える 3

1

スレッドは時間的に正確ではありません。それらが相互に依存している場合は、次のように手動で同期する必要があります。クラスで2つのスレッドを順次実行する方法

于 2013-05-07T13:22:08.850 に答える
0

2 つのスレッドを並行して実行すると、それぞれのスレッドが基盤となるオペレーティング システムによって個別に実行されます。タスク スケジューラは、どのスレッドをいつ実行するかを決定できます。これにより、経験しているような不均一な時間配分が発生する可能性があります。

これに対する 1 つの解決策は、共有Semaphoreを使用して、他のスレッドがタスクを完了するまで各スレッドをロックすることです。次に、各スレッドは 2 つのセマフォを使用します。1 つはそれ自身用で、もう 1 つは他のスレッド用です。どちらのセマフォも 1 つの許可で開始されるため、最初のrelease()呼び出しはブロックされません。スレッドは次のように機能します (疑似コード):

for (;;) {
    otherThreadSemaphore.acquire(); // blocks until the other thread called release()
    performWork();
    ownThreadSemaphore.release(); // allows the other thread to perform another iteration
}

もう 1 つは、無限ループをスレッドの外に移動することです。ループの各反復で両方のスレッドを生成し、thread.yield() を使用して両方のスレッドが終了するまで待機し、ループが再び開始されて 2 つの新しいスレッドが作成されます。ただし、スレッドの作成は高価な操作になる可能性があるため、スレッドが各反復でかなりの量の作業を行う場合にのみこれを行う必要があり、これはあまり重要ではありません。

于 2013-05-07T13:33:54.693 に答える