我是Java新手,我想知道如何做一些我在面试问题中被问到的事情。
你有三个线程T1
,T2
和T3
。
你如何确保他们按顺序完成T1
,,,T2
。
面试官让我在上面写程序。
我知道这个问题可以通过或者我无法成功的一些概念来回答。你们能告诉我如何去做吗?T3
join
count down latch
我是Java新手,我想知道如何做一些我在面试问题中被问到的事情。
你有三个线程T1
,T2
和T3
。
你如何确保他们按顺序完成T1
,,,T2
。
面试官让我在上面写程序。
我知道这个问题可以通过或者我无法成功的一些概念来回答。你们能告诉我如何去做吗?T3
join
count down latch
创建3个线程但不启动它们,然后如下
t1.start();
t1.join();
t2.start();
t2.join();
t3.start();
Thread.join 等待一个线程终止,所以顺序有保证
对我来说,这是一个棘手的问题。我会问面试官为什么他希望他们以特定的顺序完成。坦率地说,除了等待其子线程的主线程之外,我看不到任何我希望单独的线程以特定顺序完成的情况。
有多种方法可以做到这一点。最简单的方法是使用Thread.join,这将导致当前线程暂停,直到您正在调用的线程join()
完成:
someThread.join();
// the current thread won't continue until someThread completes
然后,您可以让 T3 在 T2 上加入,T2 在 T1 上加入。
但如果我是你,我会问面试官为什么他们希望线程按这个顺序完成。是因为 T3 消耗了 T2 生产的东西吗?如果是这样,像并发队列这样的东西可能会更好,因为它不那么脆弱——您可以更改哪个线程来完成消费或生产事物的工作而不会破坏事物。哎呀,生产者/消费者线程可以设置为永远不会完成,而是让一个尽可能快地生产,而另一个尽可能快地消耗。线程都是关于不知道事情发生的顺序,除了某些接触点(例如准备被消费的东西)。
所以基本上,所提出的问题有点虚假。
如果线程应该按顺序完成,那么为什么不将所有三个的代码都放在一个线程的运行中呢?