我正在研究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有可能吗?有什么想法吗?
答案 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()
?