【问题标题】:How to get one thread to wait for another thread?如何让一个线程等待另一个线程?
【发布时间】:2014-01-29 03:35:25
【问题描述】:

我有两个线程: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 完成执行,然后执行 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();

所以 ThreadD t2 将在线程 t1 完成后执行,所以线程 t2 必须等到 t1 哈希完成。

我该如何解决?

【问题讨论】:

  • 如果它是Runnable,请不要将其称为线程。在两个 Runnable 实例之间的共享对象上同步您的 run() 方法代码。第一个进入块的将首先执行并完成。
  • 为什么每个人尝试使用线程做的第一件事就是首先打败线程的全部意义?
  • 我从来不明白这些问题。如果你想要顺序执行,你为什么要使用线程呢?
  • 我的猜测是,这只是一个简化的例子,它实际上更复杂,实际上需要运行多个线程。
  • 尽管如此,如果第二个线程必须等待第一个线程完成,那么使用两个线程是没有意义的。这两个动作应该是同一个线程的一部分。您真正需要的可能是某种顺序作业调度系统。

标签: java multithreading synchronization


【解决方案1】:

使用Thread.join()。加入一个线程将等待它完成。如果你想让t2t1 之后运行,下面的sn-p 会这样做:

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

编辑:澄清一下,如果您真的只有两个这样的线程,请不要这样做 - 不需要线程并且可运行对象可以按顺序运行。如果您有多个线程同时运行,并且您需要等待所有线程都完成后再运行其他代码(线程完成后的代码不需要在线程中运行),则连接效果很好。

【讨论】:

  • 我同意。我正在回答提出的问题。在这种情况下,如果你真的只有两个这样的线程,为什么还要使用线程。但是,如果您想在继续之前等待多个线程。
  • 这只是一个例子,因为我有一个类在多线程的进程中......我想在有多线程的类中的进程首先完成(我的意思是像带有 threadC 的类)然后程序将使用 ThreadD 访问类中的代码..所以我像上面那样问...
  • 我已经尝试使用 t1.join()..然后 ThreadD 将等到线程 C 完成过程...感谢您的评论并回答所有问题..我得到了帮助.. ..请提供其他解决方案....
【解决方案2】:

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

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

【讨论】:

  • 但如果他真的想在单独的线程中执行代码,那又如何呢?
  • @user1590011 那么,显然,不要这样做。他还没有说服我。他真正想要的是 D 在 C 之后执行。我不明白为什么在一个线程中运行它们不能满足这个要求。
【解决方案3】:

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

CountDownLatch 或 Semaphore 可以实现这一点。使用 Runnables,您可以使用线程池大小为 1 的 threadPoolExecutor。

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

例如,使用线程池执行器

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

【讨论】:

  • 你能用代码@Edh举个例子,所以我会更了解..谢谢
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2021-06-21
  • 2015-02-22
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多