2016-06-15 9 views
0

私は、プロセスを実行するためにお互いを待つ必要が複数のスレッドを持っています。これは要件のためにこのようにしなければなりません。もし私がコードを表示し、期待される出力を見せたらそれは意味をなさないでしょう。ここに私のメインクラスです:複数のスレッドのステップ実行

public static ThreadedJob job1, job2; 
public static ArrayList<Thread> threads = new ArrayList<Thread>(); 
public static void main(String[] rags) throws InterruptedException{ 
    job1 = new Job1("Thread1:"); 
    job2 = new Job2("Thread2:"); 
    job1.run(); 
    job2.run(); 
    threads.add(new Thread(job1)); 
    threads.add(new Thread(job2)); 
    if (job1.getCounter() > job2.getCounter()) { 
     threads.get(0).wait(); 
     threads.get(1).notify(); 
    } 
    if (job1.getCounter() < job2.getCounter()) { 
     threads.get(1).wait(); 
     System.out.println(true); 
     threads.get(0).notify(); 
    } 
} 

そして、ここでここで

public class ThreadedJob implements Runnable{ 



protected String name; 
protected int counter = 0; 
public ThreadedJob(String name){ 
    this.name = name; 
} 

@Override 
public void run() { 

    System.out.println(name + " job 1 complete"); 
    counter++; 
    System.out.println(name + " job 2 complete"); 
    counter++; 
    System.out.println(name + " job 3 complete"); 
    counter++; 


} 

public int getCounter(){ return counter; } 

} 

です(今ちょうどすべてであること)を拡張し、スーパー(名前を呼ぶためにジョブ1とJOB2クラス)、スレッドのジョブ・クラスであります予想される出力:

Thread1: job 1 complete Thread2: job 1 complete Thread1: job 2 complete Thread2: job 2 complete Thread1: job 3 complete Thread2: job 3 complete

ここでは私のコードから出力された:

Thread1: job 1 complete Thread1: job 2 complete Thread1: job 3 complete Thread2: job 1 complete Thread2: job 2 complete Thread2: job 3 complete

質問:スレッドが一時停止してがどのように私はそれを作ることができ、行くようにできるように、そして継続。かなり多くの人が、どのようにステップアップして、期待される出力を得るのを待つことができますか?ありがとう!

重要なお知らせ:これはx個のスレッドで動作する必要があり、2でテストしています。また、スレッドは実際のアプリケーションではほとんどの時間は異なるロジックで動作しますが、同じ時間。

+1

私はあなたのスレッドを開始するのを忘れたと思います - あなたは直接ランナブルを実行しています。スレッドは何もしていません。とにかく、ソートされたら、 'CyclicBarrier'や' CountdownLatch'のようなものを見てください。 – RealSkeptic

+0

@RealSkeptic私はやったと思った...。 – Luke

+2

Ah。さて、あなたはスレッドの非常に基本的なものから始める必要があります。 'run'メソッドを使うと、現在のスレッド**のrunnables **が実行され、スレッドは開始されません。 [Oracleチュートリアル](https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html)を参照してください。 ) – RealSkeptic

答えて

1

は、基本的には、Javaのマルチスレッド、ロック、およびJavaのメモリモデルについて少し読んでもらいたいです。 ...基本的にはより多くの物事はあなたが潜在的な出力として期待するものよりも発生する可能性があることを意味

彼らは道あなたは(それにアクセスする際に任意の同期/ロックせずに、独自のカウンタを持つ各スレッド)あなたのコードを書かれています。

意味:両方のスレッドが実行を開始し、互いに完全に独立し、そのカウンターを増加します。まあ

、正確には:あなたはあなたランナブル実行を呼び出しているようあなたがないこれらの二つの他のスレッド(、ないあなたを使用して、実際にだろう場合には、そのようになりますスレッド)。

したがって、実際に3つのスレッドを使用する場合、これらのカウンタをクエリするときに3番目のスレッドが表示するものは完全にです。あなたのコードは、1つの巨大な競合状態です。

+2

あなたは、そのコードのメインスレッド以外に実際にはスレッドが実行されていないことに気付きましたか? – RealSkeptic

+0

素晴らしい発見。それに応じて私の答えを更新しました。 – GhostCat

関連する問題