在今天的一次采访中,我被问到一个我无法解决的问题:
假设有三个线程名为T1,T2和T3。现在T1会 打印数字从1到5,T2将打印从6到10的数字 T3将打印10到15之间的数字。三个线程有 已经开始说t1.start(),t2.start()和t3.start(),但T3 首先应该执行线程,然后执行T1线程,最后执行 应该执行T2线程。
请告知可能解决此问题的方法。根据我的研究,有Thread.join
或循环障碍的概念。请告知最佳方法,如果可能,请展示一小段代码以便更好地理解。
答案 0 :(得分:3)
我同意这个问题不是很好,但是你确实需要某种答案......
按照你的要求打印10-15,1-5,6-10(T3然后是T1然后是T2)(顺便说一句 - T3实际打印的是11到15吗?):
public class Test {
static class Printer implements Runnable {
private final int from;
private final int to;
private Thread joinThread;
Printer(int from, int to, Thread joinThread) {
this.from = from;
this.to = to;
this.joinThread = joinThread;
}
@Override
public void run() {
if(joinThread != null) {
try {
joinThread.join();
} catch (InterruptedException e) { /* ignore for test purposes */ }
}
for (int i = from; i <= to; i++) {
System.out.println(i);
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread T3 = new Thread(new Printer(10, 15, null));
Thread T1 = new Thread(new Printer(1, 5, T3));
Thread T2 = new Thread(new Printer(6, 10, T1));
T1.start();
T2.start();
T3.start();
}
}
CountdownLatch
也许也是一个不错的选择。
答案 1 :(得分:0)
没有真正的最佳方法。他们最有可能,希望看到你如何回答这个问题。
在处理这样模糊的问题时,我会首先尝试确定他们在寻找什么。他们需要按顺序执行吗?按顺序打印出数字,或者当其他两个线程等待时,t3需要打印(10-15)。或者他们只需要按照指示开始并在他们到达时打印出来。按照定义的顺序读取问题似乎只是让每个线程打印出定义的序列。这没有说明阻塞。您可以只创建一个包含优先级的包装类,将它们放在有序队列中,然后遍历每个线程的集合。
我认为他们也可能一直在寻找你说一些事实,即在这种情况下使用多个线程(假设他们想要数字顺序)是没有意义的,因为不管三个中的哪两个都是线程什么都不做。仅使用一个线程会更快。然后添加一些关于它的东西可能更有效地使用一些排序执行器服务,其中每个线程可以拉出下一个数字来写出公共排序资源。然后你可以采取措施来保护队列,以确保一次只删除/写入一个队列。有很多方法可以做到这一点,每个方面都有很多问题。也可以提一下阻塞与非阻塞的好处/成本。由于有许多不同的方法可以做到这一点,因此熟悉Concurrencys api可能是有意义的。
Java中的Concurrency util classes有很好的文档记录,在大多数情况下提供了有用的示例。这是一个很好的起点。请尝试查看Semaphores,Phasers或A Count Down Latch。尽管如此,实际上Executors或The Fork/Join Framework可能值得进一步研究。
对于所有漫无边际的事情感到抱歉,但我想说的是,没有一种方法可以回答这样的问题。我认为这个问题的真正含义是试图看到你的方法。要求代码示例并不能真正帮助你。花点时间坐下来阅读一些好的教程。