假设我们有两个线程T1和T2。我希望在T1之后启动T2,但是在T1完成时不启动。
答案 0 :(得分:1)
您的问题并不完全清楚,但您可能需要查看mutex locks,其工作类似于下面给出的示例。除了线程,你想要使用Lock类。
public class ThreadingTest {
private Thread t1, t2;
private boolean completed;
public ThreadingTest(){
t1 = new Thread(new Runnable(){
@Override
public void run() {
Thread.sleep(1000);
mutex();
}
});
t2 = new Thread();
completed = false;
}
public void doStuff(){
t1.start();
if(!completed)
t2.start();
}
public void mutex(){
completed = true;
}
public static void main(String[] args){
new ThreadingTest();
}
}
答案 1 :(得分:0)
你是什么意思“开始?”
这有什么问题?
Thread t1 = ...;
Thread t2 = ...;
t1.start();
t2.start();
在开始t2之前,字面上启动 t1,但是在第二个线程可以启动之前,你可能需要第一个线程做吗?
RE350和igreen都有同样的好主意,可以这样实现:
Thread t2 = ...;
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
doTheThingThatNeedsToBeDoneFirst();
t2.start();
doTheRest();
}
});
t1.start();
或者,如果有某些原因你不能这样做,那么使用高级同步对象(如信号量)会稍微复杂一些(我认为这是David Schwartz所建议的):
Semaphore semaphore = new Semaphore(0);
Thread t2 = ...;
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
doTheThingThatNeedsToBeDoneFirst();
semaphore.release();
doTheRest();
}
});
t1.start();
semaphore.acquire();
t2.start();
答案 2 :(得分:0)
使用Join方法....在一个方法的主体中调用它
join方法允许一个线程等待另一个线程的完成。如果t是其当前正在执行其线程的Thread对象,则
t.join();
答案 3 :(得分:0)
创建线程时,它们默认保持优先级为5.因此,在您的情况下,T1& T2将保持优先级为5,调度程序可以在运行时选择其中任何一个。
要确保T1在T2之前运行,请尝试将T1的优先级设置为高于线程T2。方法setPriority(int value)可以帮助您完成此任务。 例如:T1.setPriority(10)。
这样,调度程序将始终首先运行T1。
希望这有帮助。