5

このクラスでは、forループを10回実行しています。このクラスはRunnableインターフェースを実装します。ここでmain()で2つのスレッドを作成します。これで、両方とも10までループを実行します。しかし、各スレッドのループ数を確認したいと思います。t1が7を超えている場合は、t2を完了するために1秒間スリープさせます。しかし、これを達成する方法は?コードをご覧ください。私は試みましたが、完全に愚かに見えます。スレッドのデータをチェックする方法だけ???

class SimpleJob implements Runnable {
    int i;
    public void run(){
        for(i=0; i<10; i++){
            System.out.println(Thread.currentThread().getName()+" Running ");
        }        
    }

    public int getCount(){
        return i;
    }
}
public class Threadings {
    public static void main(String [] args){
        SimpleJob sj = new SimpleJob();
        Thread t1 = new Thread(sj);
        Thread t2 = new Thread(sj);

        t1.setName("T1");
        t2.setName("T2");

        t1.start();
        try{
            if(sj.getCount() > 8){ // I know this looks totally ridiculous, but then how to check variable i being incremented by each thread??
                System.out.println("Here");
                Thread.sleep(2000);
            }            
        }catch(Exception e){
            System.out.println(e);
        }
        t2.start();
    }    
}

助けてください

4

3 に答える 3

7

スレッドの速度低下に頼るのではなく、何らかの同期オブジェクトを使用する必要があります。java.util.concurrent パッケージのクラスの 1 つを確認することを強くお勧めします。この CountdownLatch に使用できます - スレッド 1 が待機し、スレッド 2 がカウントダウンを実行してロックを解放し、スレッド 1 を続行します (解放はスレッド 2 コードの最後で行う必要があります)。

于 2012-06-18T19:11:27.797 に答える
0

目標が 2 つの Runnables を (スレッドとして) 並行して実行し、両方が完了するのを待つことである場合は、複雑さ/パワーの昇順で次のことができます。

  1. Thread.join を使用します (@Suraj Chandran によって提案されていますが、彼の返信は削除されたようです)
  2. CountDownLatch を使用します (@zaske によっても提案されているように)
  3. ExecutorService.invokeAll() を使用する

編集が追加されました

まず、「もしあなたが7歳なら、もう一方を待つ」という魔法の論理が何であるかを理解していません。しかし、メイン コードから Thread.join() を使用するには、コードは次のようになります。

t1.start();  // Thread 1 starts running...
t2.start();  // Thread 2 starts running...

t1.join();   // wait for Thread 1 to finish
t2.join();   // wait for Thread 2 to finish

// from this point on Thread 1 and Thread 2 are completed...
于 2012-06-18T19:13:11.647 に答える
0

一度に 1 つのスレッドが入力できる同期ブロックを追加しました。両方のスレッドが並行してメソッドを呼び出して入力します。1 つのスレッドが競争に勝ち、ロックを取得します。最初のスレッドがブロックを離れた後、2 秒間待機します。この時点で、2 番目のスレッドはループを反復処理できます。この動作が必要だと思います。2 番目のスレッドも 2 秒間待機してはならない場合は、最初のスレッドがブロックを終了したことを示すブール値フラグを設定し、このフラグを if ステートメントで使用して、2 番目のスレッドの待機時間を防ぐことができます。

class SimpleJob implements Runnable {
int i;
public void run(){

    synchronized (this) {
        for(i=0; i<8; i++){
            System.out.println(Thread.currentThread().getName()+" Running ");
        } 
    } 

    try {
        System.out.println("Here");
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    for(i=0; i<2; i++){
        System.out.println(Thread.currentThread().getName()+" Running ");
    }
}

public int getCount(){
    return i;
}
}

public class Threadings {
public static void main(String [] args){
    SimpleJob sj = new SimpleJob();
    Thread t1 = new Thread(sj);
    Thread t2 = new Thread(sj);

    t1.setName("T1");
    t2.setName("T2");

    t1.start();
    t2.start();
}    
}
于 2012-06-18T19:24:19.233 に答える