1

私はJavaでスレッドプログラミングに取り組んでいますが、2つのスレッドを次々に実行しなければならないという問題に悩まされていました。以下は、私の問題を簡単に要約したコードスニペットです。

class A{
  //default execute method of this class
  String a="thread1";
  String b="thread2";
  public void execute(){
    if(a=="thread1"){
       CreateThread1 t1 = new CreateThread1(this);
       t1.call();
    }
    else if(b=="thread2") {
      CreateThread1 t2 = new CreateThread1(this);
       t2.call();
    }
  }//end of execute
  public void UpdateUI(){
    try{
      Display.getDefault.asyncExec(new Runnable(){
        public void run(){
            //ui update code here
        }
      });
    }
    catch(SWTException e){
    }
  }   
}

Class CreateThread1{
    private A object;
    public CreateThread1(A object){
      this.object=object
    }
    public void call(){
      Thread t = new Thread(this);
      t.start();
    }
    public void run(){ 
      //business logic here 
       object.UpdateUI();//updates UI 
    }
}

ここで、クラスAはスレッドタスクの進行状況を示すユーザーインターフェイスクラスです。上記のコードでは、CreateThread1が開始され、CreateThread1が強制終了されなくても、CreateThread2も開始されます。CreateThread1がタスクを完全に終了した後にのみ、CreateThread2がトリガーされるようにしたいと思います。何か案は?

4

4 に答える 4

3

サイズが1のaを使用できますFixedThreadPool。これにより、順次実行が保証されます。

ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(runnable1);
executor.submit(runnable2);
executor.shutdown();
executor.awaitTermination(10, TimeUnit.SECONDS); //waits until both runnables have finished.

編集

ExecutorServiceは内部で同期化された構造を使用するため、runnable1がrunnable2の前に実行されると安全に想定できます。

于 2012-04-11T16:47:28.220 に答える
1

Thread#joinjava.util.concurrentパッケージ内にあるクラスを使用することを好みますが。

于 2012-04-11T16:46:09.533 に答える
1

私はあなたの質問をすぐに読みましたが、おそらく必要なのはjoin()です。Java同時実行チュートリアルを見たことがありますか? http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

于 2012-04-11T16:46:31.927 に答える
0

SynchronousQueueでThreadPoolExecutorを使用できます。これは、ThreadPoolExecutorのドキュメントで説明されています。

于 2012-04-11T16:45:34.063 に答える