2

在今天的采访中,我被问到一个我无法解决的问题:

假设有三个线程,分别命名为 T1、T2 和 T3。现在 T1 将打印从 1 到 5 的数字,T2 将打印从 6 到 10 的数字,T3 将打印从 10 到 15 的数字。三个线程已由 t1.start()、t2.start() 启动和 t3.start(),但是应该先执行 T3 线程,然后执行 T1 线程,最后执行 T2 线程。

请就解决此问题的可能方法提出建议。根据我的研究,存在Thread.join或循环障碍的概念。请就最佳方法提出建议,如果可能,请显示一小段代码以便更好地理解。

4

2 回答 2

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也许在这里也是一个不错的选择。

于 2013-02-22T17:43:36.603 回答
0

没有真正的最佳方法。他们最有可能想看看你是如何回答这个问题的。

在处理这样的模糊问题时,我会首先尝试真正确定他们在寻找什么。他们需要按顺序执行吗?按顺序打印出数字,或者 t3 是否需要在其他两个线程等待时打印 (10-15)。还是他们只需要按照指示的顺序开始并在到达时打印出来。阅读问题的陈述似乎只是让每个线程在以定义的顺序启动它们之后打印出定义的序列。这并没有说明阻塞。您可以只创建一个包含优先级的包装类,将它们放入有序队列中,然后在每个线程开始时遍历集合。

我认为他们可能也一直在寻找您对在这种情况下使用多个线程(假设他们希望数字是连续的)没有意义的事实说些什么,因为不管三个线程中的两个正在做什么没有什么。只使用一个线程会更快。然后添加一些关于它可能更有效的使用某种排序执行器服务,其中每个线程可以提取下一个数字以从公共排序资源中写入。然后你可以采取一些方法来保护队列,以确保一次只删除/写入一个。有很多方法可以做到这一点,每种方法都有很多问题。提及阻塞与非阻塞的好处/成本也可能很好。由于有许多不同的方法可以做到这一点,

Java 中的Concurrency 实用程序类有很好的文档记录,并且在大多数情况下提供了有用的示例。这是一个很好的起点。为此,请尝试查看SemaphoresPhasersA Count Down Latch。不过,在实践中,ExecutorsFork/Join 框架可能值得进一步研究。

对所有这些漫无边际的事情感到抱歉,但我想说的是,没有一种最好的方法来回答这样的问题。我认为这个问题的真正目的是试图了解您的方法。要求提供代码示例并不会真正帮助您。花点时间坐下来阅读一些好的教程。

于 2013-02-22T17:43:19.497 回答