如何在类中顺序执行两个线程

时间:2012-04-11 16:42:12

标签: java multithreading

我正在研究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类是显示Thread任务进度的User Interface类,在上面的代码中,CreateThread1启动,CreateThread2也会启动,即使CreateThread1没有被杀死,我希望CreateThread2只有在CreateThread1完成任务后才能触发.Is有可能吗?有什么想法吗?

5 个答案:

答案 0 :(得分:3)

您可以使用大小为1的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之前运行。

答案 1 :(得分:1)

Thread#join,虽然我更喜欢使用java.util.concurrent包中的类。

答案 2 :(得分:1)

我很快就读到了你的问题,但你可能需要的是加入() 你看过Java Concurrency Tutorial了吗? http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html

答案 3 :(得分:0)

您可以ThreadPoolExecutor使用SynchronousQueue。这在ThreadPoolExecutor的文档中有描述。

答案 4 :(得分:0)

我认为顺序运行线程的最简单方法是

Thread1.run();
Thread2.run();
.
.

为什么在start()甚至不创建帖子时使用run()