如何在类中顺序执行两个线程
我正在研究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类是User Interface类,它显示了Thread任务的进度,在上面的代码中CreateThread1启动,CreateThread2也启动,即使CreateThread1没有被杀死,我希望只有在CreateThread1完成任务后才能触发CreateThread2。这可能吗? 有任何想法吗?
您可以使用大小为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之前运行。
Thread#join
,虽然我更喜欢使用java.util.concurrent
包中的类。
我很快就读到了你的问题,但你可能需要的是join()你看过Java Concurrency Tutorial吗? http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
您可以将ThreadPoolExecutor与SynchronousQueue一起使用。 这在ThreadPoolExecutor的文档中有所描述。
我认为顺序运行线程的最简单方法是
Thread1.run(); Thread2.run(); . .
为什么在run()
甚至不创建线程时使用start()
!