2017-02-22 14 views
1

私は自分のスレッドが競争のようにお互いに従うようにしようとしており、スレッド同士がお互いを待ちたいと思っています。 ように:お互いを待っているスレッド

DUCK is on his 1 lap 
PIGGY is on his 1 lap 
ELEFANT is on his 1 lap 
STAR is on his 1 lap 

DUCK is on his 2 lap 
PIGGY is on his 2 lap 
ELEFANT is on his 2 lap 
STAR is on his 2 lap 

など..

public class ExThread implements Runnable { 

    String name; 
    Random r = new Random(); 
    int count; 
    int sleepTimer; 

    public ExThread(String name) { 
     this.name = name; 
    } 

    @Override 
    public void run() { 
     try { 
      for(int i = 0; i < 10; i++) { 
       count++; 
       sleepTimer = r.nextInt(1000)+1; 
       Thread.sleep(sleepTimer); 
       System.out.println(
        name + " Starts after "+sleepTimer+" milliseconds break"); 
       System.out.println(
        name+" is on his "+count+" lap"); 

      } 
      System.out.println(name+" completes the race!!!"); 
     } 
     catch (Exception e){} 
    } 

public class ThreadsEx { 

    public static void main(String[] args) throws InterruptedException { 
     Thread t1 = new Thread(new ExThread("STAR")); 
     Thread t2 = new Thread(new ExThread("ELEFANT")); 
     Thread t3 = new Thread(new ExThread("PIGGY")); 
     Thread t4 = new Thread(new ExThread("DUCK")); 
     t1.start(); 
     t2.start(); 
     t3.start(); 
     t4.start(); 
    } 
} 
+2

あなたはもう少し具体的に説明してくださいできます。あなたの問題は何ですか?あなたの現在の結果は何ですか?どのようにしてスレッドは互いに「追従して」待たなければなりませんか? – GregaMohorko

+0

@CasperFlintrupあなたは1つのスレッドの複雑さを意味する別のスレッドが開始されますか?私は正しいですよ ? –

+0

[Phaser](https://dzone.com/articles/java-7-understanding-phaser)を見てください。それはあなたを助けるはずです。少し遅れて例を書こうとしています – rvit34

答えて

0

あなたはjoinを使用することができます。

for(i = 0; i < threads.length; i++){ 
    threads[i].join(); 
} 

参加すると、現在のスレッド(あなたのケースのメインスレッドは私が推測します)がブロックされます。 forループが終了すると、すべてのスレッドが処理されます。あなたのケースでは

、あなたはそれぞれのスレッドが必要ですこのためhttps://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CyclicBarrier.htmlを使用することができます代わりに10

for(j = 0; j < numberOfLaps; j++){ 
    for(i = 0; i < threads.length; i++){ 
     threads[i].join(); 
    } 
} 
0

のシングルラップを間に合わせることができます。

コードは、それらがランダムな状態で接種されているので、それは彼らが(お互いのミリ秒以内に作成されている場合は特にRandomの複数のインスタンスを持つことが非常に悪いですが、まずこの

import java.util.Random; 
import java.util.concurrent.CyclicBarrier; 

public class ExThread implements Runnable { 

String name; 
Random r = new Random(); 
int count; 
int sleepTimer; 
CyclicBarrier barrier; 

public ExThread(String name, CyclicBarrier barrier) { 
    this.name = name; 
    this.barrier = barrier; 
} 

public static void main(String[] args) throws InterruptedException { 
    CyclicBarrier barrier = new CyclicBarrier(4); 

    Thread t1 = new Thread(new ExThread("STAR", barrier)); 
    Thread t2 = new Thread(new ExThread("ELEFANT", barrier)); 
    Thread t3 = new Thread(new ExThread("PIGGY", barrier)); 
    Thread t4 = new Thread(new ExThread("DUCK", barrier)); 
    t1.start(); 
    t2.start(); 
    t3.start(); 
    t4.start(); 
} 

@Override 
public void run() { 
    try { 
     for (int i = 0; i < 10; i++) { 
      count++; 
      sleepTimer = r.nextInt(1000) + 1; 
      Thread.sleep(sleepTimer); 
      System.out.println(
        name + " Starts after " + sleepTimer + " milliseconds break"); 
      System.out.println(
        name + " is on his " + count + " lap"); 
      barrier.await(); 
     } 

     System.out.println(name + " completes the race!!!"); 
    } catch (Exception e) { 
    } 
} 

}

2

のようになりますこれらの時間スケールであまり変化しないコンピュータ)

スレッドをお互いに待機させるには、CyclicBarrierを使用します。優れた例としてjavadoc。しかし、これはレースそのものを妨げるため、あなたが後にしていることではないと思います。

あなたが望むかもしれないのは、他のスレッドがそれまで走っていたラップを定期的に印刷するある種の審判スレッドです。

1

私はルールを仮定は以下のとおりです。

  • すべてのスレッドが同じ膝の上でなければなりません
  • スレッドは、任意の順序で自分のラップを終えることができますが、すべてのスレッドがそのラップを完了する前に、次のラップに進行することはできません。

上記のこれらの規則は、スレッド間の同期のいくつかのフォームを必要とし、Java

で利用可能ないくつかの同期オプションは初期があります提案は、すべてのスレッドがアクセス権を持つ値を使用することです進歩を伝え、次のラップに進むことができるかどうかを知り、互いの進歩を追跡することができるようにします。

実装

  • System.outにいくつかの一般的な注意事項。printlnは、マルチスレッドアプリケーションでコンソールにメッセージがプリントアウトされる順序を保証しません。コード内で呼び出されるメソッドとは異なる順序でコンソールに到着できます。
  • Thread.sleepは、正確なスリープ時間を保証しません。
0

このようにあなたは、java.util.concurrentのを使用する必要があります。

import java.util.Random; 
import java.util.concurrent.CountDownLatch; 
import java.util.concurrent.CyclicBarrier; 

public class RendezVous extends Thread { 

    private final CountDownLatch _start; 
    private final CyclicBarrier _rdv; 
    private final CountDownLatch _stop; 

    public RendezVous(
     String   name, 
     CountDownLatch start, 
     CyclicBarrier rdv, 
     CountDownLatch stop ) 
    { 
     super(name); 
     _start = start; 
     _rdv = rdv; 
     _stop = stop; 
     start(); 
    } 

    @Override 
    public void run() { 
     final Random rnd = new Random(System.currentTimeMillis()); 
     try { 
     System.out.println(getName() + " is started"); 
     _start.countDown(); 
     System.out.println(getName() + " waits for others"); 
     _start.await(); 
     System.out.println(getName() + " is running"); 
     for(int count = 0, i = 0; i < 10; ++i, ++count) { 
      final long sleepTimer = rnd.nextInt(1000) + 1; 
      sleep(sleepTimer); 
      System.out.println(getName() +" is on his " + count + " lap"); 
      _rdv.await(); 
     } 
     _stop.countDown(); 
     _stop.await(); 
     System.out.println(getName() + " completes the race"); 
     } 
     catch(final Exception e) { 
     e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     final CountDownLatch start = new CountDownLatch(4); 
     final CyclicBarrier rdv = new CyclicBarrier(4); 
     final CountDownLatch stop = new CountDownLatch(4); 
     new RendezVous("STAR" , start, rdv, stop); 
     new RendezVous("ELEFANT", start, rdv, stop); 
     new RendezVous("PIGGY" , start, rdv, stop); 
     new RendezVous("DUCK" , start, rdv, stop); 
    } 
} 

実行ログ:

DUCK is started 
STAR is started 
DUCK waits for others 
PIGGY is started 
ELEFANT is started 
PIGGY waits for others 
STAR waits for others 
PIGGY is running 
STAR is running 
ELEFANT waits for others 
DUCK is running 
ELEFANT is running 
STAR is on his 0 lap 
PIGGY is on his 0 lap 
DUCK is on his 0 lap 
ELEFANT is on his 0 lap 
DUCK is on his 1 lap 
STAR is on his 1 lap 
ELEFANT is on his 1 lap 
PIGGY is on his 1 lap 
STAR is on his 2 lap 
ELEFANT is on his 2 lap 
PIGGY is on his 2 lap 
DUCK is on his 2 lap 
STAR is on his 3 lap 
PIGGY is on his 3 lap 
ELEFANT is on his 3 lap 
DUCK is on his 3 lap 
DUCK is on his 4 lap 
PIGGY is on his 4 lap 
ELEFANT is on his 4 lap 
STAR is on his 4 lap 
STAR is on his 5 lap 
PIGGY is on his 5 lap 
ELEFANT is on his 5 lap 
DUCK is on his 5 lap 
STAR is on his 6 lap 
DUCK is on his 6 lap 
PIGGY is on his 6 lap 
ELEFANT is on his 6 lap 
PIGGY is on his 7 lap 
ELEFANT is on his 7 lap 
STAR is on his 7 lap 
DUCK is on his 7 lap 
ELEFANT is on his 8 lap 
DUCK is on his 8 lap 
PIGGY is on his 8 lap 
STAR is on his 8 lap 
STAR is on his 9 lap 
ELEFANT is on his 9 lap 
DUCK is on his 9 lap 
PIGGY is on his 9 lap 
DUCK completes the race 
PIGGY completes the race 
ELEFANT completes the race 
STAR completes the race 
関連する問題