如何让一个线程等待另一个线程?

时间:2014-01-29 03:35:25

标签: java multithreading synchronization

我有两个线程:C和D.如果我想首先执行线程C,那么线程D,这是我必须做的:

这是类ThreadC的代码:

public class ThreadC implements Runnable {

    int isi[] = new int[100];

    public void run () {
        for (int i = 0;i < isi.length; i++) {
            isi[i] = i;
            System.out.print(isi[i] + " ");
        }
    }
}

这是类ThreadD的代码:

public class ThreadD implements Runnable {

    int temp=0;

    public void run () {
        for(int i = 0; i < 1000; i++)
            temp += i;
        System.out.println("nilai temp : " + temp);
    }
}

这是主要方法:

public class main {
    public static void main (String[] args) {
        ThreadC tc = new ThreadC();
        Thread t1 = new Thread(tc);
        t1.start();
        ThreadD td = new ThreadD();
        Thread t2 = new Thread(td);
        t2.start();
    }
}

修改

我实际上有问题,我上课了。首先我称之为ThreadC。我希望线程C完成执行然后线程将执行。然后我打电话给ThreadD。它就像下面的代码:

for (int j = 0; j < idW.length; j++) {
    webtext = d.getWebText(idW[j]); 
    ThreadPrepo tpo = new ThreadPrepo(webtext, host[j%jumhost], "server", 1099, idW[j]);  
    Thread t1 = new Thread(tpo);
    t1.start();

}
ThreadD td = new ThreadD;
Thread t2 = new Thread(t2);
t2.start();

因此ThreadD t2将在线程t1完成执行后执行,因此线程t2必须等到t1哈希结束。

我该如何解决?

3 个答案:

答案 0 :(得分:1)

使用Thread.join()。加入一个线程将等待它完成。如果您希望在t2之后运行t1,则以下代码段会执行此操作:

t1.start();
t1.join(); // blocks until t1 is complete
t2.start();

编辑:澄清一下,如果你真的只有两个这样的线程,不要这样做 - 不需要线程,可以按顺序运行runnables。如果你有多个并发运行的线程并且你需要等待所有这些线程在运行其他代码之前完成连接(在线程完成之后的代码不需要在线程中运行),连接就可以正常工作。

答案 1 :(得分:0)

除了Jeff的回答,java.util.concurrent还有很多选择。

CountDownLatch或Semaphore会实现这一目标。使用Runnables,您可以使用threadPoolExecutor,线程池大小为1.

如果您不希望它们同时运行,那么仅创建一个线程

可能是有意义的

例如,使用线程池执行程序

ExecutorService executor = Executors.newFixedThreadPool(1);
executor.execute(new ThreadC());
executor.execute(new ThreadD());

答案 2 :(得分:0)

根本不要使用线程。只需按所需顺序运行Runnables:

    ThreadC tc=new ThreadC();
    tc.run();
    ThreadD td=new ThreadD();
    td.run();