【问题标题】:Thread concurrency wait() other thread to finish and continue its work线程并发 wait() 其他线程完成并继续其工作
【发布时间】:2012-02-06 22:43:40
【问题描述】:

我想让一个线程等待另一个线程完成,而不是终止它,启动第二个线程并创建第一个线程的另一个实例。这样做对吗?

Thread1 first = new Thread1();
first.start();
while(flag==true){//start while1
first.wait();
Thread2 second = new Thread2();
second.start();
while(second.isAlive()){
Toast toast = new Toast(...WORKING IN PROGRESS...);//just show something
}
flag = false;
}//end of while1

线程会先等到第二个线程停止运行吗?我只希望线程首先暂停并在第二个线程完成运行后继续工作。感谢您的帮助

【问题讨论】:

    标签: android multithreading jakarta-ee concurrency wait


    【解决方案1】:

    假设您正在编写 Java,您可以使用 Thread.join() 方法强制某个线程等待另一个线程结束。例如,如果您希望线程 1 等到线程 2 完成:

    Thread Thread2 = new SomethingImplementingThread();
    Thread Thread1 = new Thread(new Runnable() {
                      public Thread waitforthisone;
                      public void run() {
                         try {
                         waitforthisone.join();
                         } catch (InterruptedException e) {}
                         // Do stuff once waitforthisone has finished
                      });
    
    Thread1.waitforthisone = Thread2;
    Thread2.start();
    Thread1.start(); // When thread 1 starts it will run Thread 2's join function, and thus 
                     // wait for thread 2 to exit
    

    注意:代码中的等待命令将导致线程运行(在本例中不是线程 1 或线程 2,而是创建它们的线程)等待()[第 4 行],即进入睡眠状态。具体来说,等待的线程只有在另一个线程(thread1或thread2)调用first.notify()时才能被唤醒。否则,您上面提供的代码将永远不会超过第 4 行。

    【讨论】:

    • 我在解释自己方面非常糟糕。对不起。我启动了一个线程,该线程每 2/3 秒持续连接到服务器,检查是否有消息发送给他,说它仍然可以作为客户端使用,因为它也提供服务。它工作正常。现在我用 onclickListener 实现了一个按钮,我想暂停线程并启动另一个想要连接到服务器的线程向它发送请求(例如要转换的位图)。发送请求并收到答案后,此线程正常,请停止。现在我希望第一个线程继续检查是否有客户端的结果或数据。
    • thead 1 应该永远不会死,除非我将它的标志设置为 false 和 finish() 的按钮退出以关闭 mainActivity 线程。
    【解决方案2】:

    我认为您正在寻找这样的东西:

    class Worker implements Runnable{
    
        public void run(){
            int count = 0;
            while(true){
                Toast toast = new Toast(...WORKING IN PROGRESS...);//just show something
                count++;
    
                if(count == 10)
                    break;
            }
        }
    }
    

    然后只需将可运行的Worker 传递给线程:

    Thread first = new Thread(new Worker());
    first.start();
    first.join();// waits for the first thread to finish
    Thread second = new Thread(new Worker());
    second.start();
    

    还请注意,除非您创建一个名为 WorkerWorker2 的类,否则它们将不存在。但是,几乎没有理由执行一个线程,等待它完成然后再执行另一个线程:这完全违背了并发性的目的,您还不如顺序执行代码。

    【讨论】:

      【解决方案3】:

      完全可以同步线程——我最喜欢的方法之一是使用CountdownLatch——但是你的代码显示出对如何使用它们缺乏了解。我建议在继续之前阅读更多关于 Threads 的内容。如果你做错了,线程和并发很容易搞砸。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-03
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多