如何确保一个线程在另一个线程之前启动?

时间:2015-05-13 18:12:46

标签: java multithreading

假设我们有两个线程T1和T2。我希望在T1之后启动T2,但是在T1完成时不启动。

4 个答案:

答案 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。

希望这有帮助。