java - 执行两个线程,一个等待另一个,而主线程继续

标签 java multithreading executorservice

如何启动两个线程,其中线程 1 首先执行,线程 2 在线程 1 结束时启动,而主方法线程可以继续其工作而无需锁定其他两个线程?

我已经尝试过 join() 但是它需要从必须等待另一个的线程调用,没有办法做像 thread2.join(thread1); 这样的事情。 如果我在 main() 中调用连接,我因此有效地停止了主线程的执行,而不仅仅是线程 2。

因此我尝试使用 ExecutorService 但同样的问题。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Test
{
    public static void main(String args[]) throws InterruptedException
    {
        System.out.println(Thread.currentThread().getName() + " is Started");

        class TestThread extends Thread
        {
            String name;
            public TestThread(String name)
            {
                this.name = name;
            }

            @Override
            public void run()
            {
                try
                {
                    System.out.println(this + " is Started");
                    Thread.sleep(2000);
                    System.out.println(this + " is Completed");
                }
                catch (InterruptedException ex)  {  ex.printStackTrace(); }
            }

            @Override
            public String toString()  { return "Thread " + name; }
        }

        ExecutorService executor = Executors.newCachedThreadPool();
        executor.execute(new TestThread("1"));

        boolean finished = executor.awaitTermination(1, TimeUnit.HOURS);

        if(finished)
        {
           //I should execute thread 2 only after thread 1 has finished
            executor.execute(new TestThread("2"));
        }

        //I should arrive here while process 1 and 2 go on with their execution
        System.out.println("Hello");
    }
}

#EDIT:为什么我需要这个:

我需要这个,因为线程 1 将元素从一个数据库表复制到另一个数据库,线程 2 必须复制一个链接表,该链接表引用从线程 1 复制的表。 因此,线程 2 必须仅在线程 1 完成时才开始填充其链接表,否则数据库将给出完整性错误。 现在想象一下,由于复杂的链接表,我有几个具有不同优先级的线程,你有一个想法。

最佳答案

第二个线程可以像这样自定义(将前一个线程作为参数):

public static void main(String[] a) {
    Thread first = new Thread(new Runnable() {
        @Override
        public void run() {

        }
    });

    Thread second = new MyThread(first);
    first.start();
    second.start();

    //continue executing
}

public static class MyThread extends Thread {

    private Thread predecessor;

    public MyThread(Thread predecessor) {
        this.predecessor = predecessor;
    }

    public void run() {
        if (predecessor != null && predecessor.isAlive()) {
            try {
                predecessor.join();
            } catch (InterruptedException e) {}
        }
        //do your stuff
    }
}

关于java - 执行两个线程,一个等待另一个,而主线程继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17472572/

相关文章:

java - ExecutorService(int n) 和 Thread.activeCount() 是如何工作的?

java - 如何使用 ExecutorService 等待所有线程完成?

java - JPA : How to save list with order in a many-to-many relationship

java - 使用 javaMail 检索附件文件名时出现问题

java - 为什么在java中的线程对象上调用start()时没有立即调用run()

javascript - 将 JavaScript 回调传递给在另一个线程中调用它的 FFI 函数是否安全?

java - Outputstream是一个抽象类,所以我们不能实例化它。为什么要为Outputstream类提供一个默认的构造函数呢?

java - 用 Joda-time 进行时间计算?

java - 事件监听器列表的线程安全性如何?

java - 如果我调用 return 会发生什么;从可运行?