关于在条件下启动线程

时间:2013-02-22 17:14:58

标签: java multithreading

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

  

假设有三个线程名为T1,T2和T3。现在T1会   打印数字从1到5,T2将打印从6到10的数字   T3将打印10到15之间的数字。三个线程有   已经开始说t1.start(),t2.start()和t3.start(),但T3   首先应该执行线程,然后执行T1线程,最后执行   应该执行T2线程。

请告知可能解决此问题的方法。根据我的研究,有Thread.join或循环障碍的概念。请告知最佳方法,如果可能,请展示一小段代码以便更好地理解。

2 个答案:

答案 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有很好的文档记录,在大多数情况下提供了有用的示例。这是一个很好的起点。请尝试查看SemaphoresPhasersA Count Down Latch。尽管如此,实际上ExecutorsThe Fork/Join Framework可能值得进一步研究。

对于所有漫无边际的事情感到抱歉,但我想说的是,没有一种方法可以回答这样的问题。我认为这个问题的真正含义是试图看到你的方法。要求代码示例并不能真正帮助你。花点时间坐下来阅读一些好的教程。