Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让一个线程等待另一个线程?_Java_Multithreading_Synchronization - Fatal编程技术网

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

Java 如何让一个线程等待另一个线程?,java,multithreading,synchronization,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

我有两个线程: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] + " ");
        }
    }
}
这是主要的方法:

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完成执行,然后将执行for下的线程。然后我叫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();
for(int j=0;j
所以线程t2将在线程t1完成执行后执行,所以线程t2必须等到t1散列完成

如何解决这个问题?

使用。连接到线程将等待它完成。如果希望
t2
t1
之后运行,则以下代码段将执行此操作:

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

编辑:为了澄清,如果你真的只有两个这样的线程,不要这样做-线程是不需要的,可运行程序可以按顺序运行。如果您有多个线程同时运行,并且您需要等待所有线程完成后再运行其他代码(线程完成后的代码不需要在线程中运行),那么联接工作正常。

除了Jeff的答案外,java.util.concurrent还有很多选项

倒计时锁存器或信号灯可以实现这一点。使用Runnables,您可以使用线程池大小为1的threadPoolExecutor

如果您不希望它们同时运行,那么只创建一个线程可能是有意义的

例如,使用线程池执行器

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

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

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

如果它是可运行的,不要称它为线程。在两个
Runnable
实例之间同步共享对象上的
run()
方法代码。第一个进入该块的线程将首先执行并完成。为什么每个人都试图用线程做的第一件事就是首先破坏线程的全部意义?我从来都不理解这些问题。如果你想要顺序执行,为什么要使用线程呢?我的猜测是,这只是一个简化的例子,实际上更复杂的事情,实际上需要运行多个线程。然而,如果第二个线程必须等待第一个线程完成,那么使用两个线程是没有意义的。这两个操作应该是同一线程的一部分。也许你真正想要的是某种顺序作业调度系统,我同意。我正在回答这个问题。在本例中,如果您真的只有两个这样的线程,那么为什么要使用线程呢。但是,如果您想在继续之前等待多个线程,这只是一个示例,因为我有多线程进程中的类where…我希望有多线程的类中的进程首先完成(我的意思是像threadC的类一样)然后程序将使用ThreadD在类中访问代码。所以我像上面那样问…我尝试使用t1.join()…然后ThreadD将等待线程C完成过程…感谢您的评论并回答所有。。。。我想帮忙。。。。任何其他的解决方案都可以……但是如果他真的想在单独的线程中执行代码,那怎么办?@user1590011那么,呃,显然,不要这样做。他还没有说服我。他真正想要的是D在C之后执行。我不明白为什么在一个线程中同时运行它们不能满足这一要求。你能用代码@Edh举个例子吗,这样我会更理解。谢谢
    ThreadC tc=new ThreadC();
    tc.run();
    ThreadD td=new ThreadD();
    td.run();