【问题标题】:What is the proper way to let threads print out sequentially using join使用连接让线程按顺序打印的正确方法是什么
【发布时间】:2017-05-18 21:23:11
【问题描述】:

我很好奇如何让线程使用join()顺序打印出来。(也欢迎任何其他方式。)例如,我的代码如下:

private static class LittleThread implements Runnable {
    int val;
    public LittleThread(int i) {
        val = i;
    }
    public void run() {
        System.out.println("Thread " + val + " finished.");
    }
}
public static void main(String[] args) throws Exception {
    for (int i = 1; i <= 10; i++) {
        new Thread(new LittleThread(i)).start();
    }
}

我想知道,我们如何处理这段代码,以使 main() 按顺序打印:

线程 1 完成。
线程 2 已完成。
线程 3 已完成。
...

【问题讨论】:

  • “按顺序运行线程” - 这有点没抓住重点。
  • 如何用锤子拧螺丝?你没有。 (为什么要按顺序运行线程?为什么每个人对线程做的第一件事似乎总是让它们完全无用?)
  • @DavidSchwartz 我同意。但这是一个被问到的面试问题。我认为面试官只是想确保应聘者知道多线程是如何工作的,以及你是否知道如何使用一些线程函数来使上面显示的代码工作。更多测试多线程概念。
  • 然后我给出了面试问题的正确答案——你不这样做是因为它没有意义。大多数面试问题都在寻找你如何推理一个问题。当被问及如何做你永远不会做的事情时,你应该说你永远不会这样做并解释原因!如果面试问题是“你如何使用手提钻将恶魔从某人的脑袋里赶走”,那么答案不是关于如何拿着手提钻!
  • 对这段代码最简单的修改是使用run()而不是start()

标签: java multithreading join


【解决方案1】:

要使多个Runnable对象,在单独的Thread中执行,顺序执行,应该使用单线程ExecutorService

public static void main(String[] args) throws Exception {
    ExecutorService executor = Executors.newSingleThreadExecutor();

    for (int i = 0; i < 10; i++) {
        executor.submit(new LittleThread(i));
    }

    executor.shutdown();
}

ExecutorService 负责正确管理 Thread 对象(好的,在这种情况下都是一个)...根据需要创建它们(它),并通过调用 join 终止它们(如服务已关闭)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多