如何确保Java线程运行直到完成而不中断?

时间:2016-08-26 05:43:10

标签: java multithreading concurrency

我有一个有趣的问题,它似乎很简单,但我似乎可以在线或在stackoverflow上找到它的任何解决方案。

我有一个程序可以生成线程来搜索迷宫的路径,以便找到出路。到达死胡同时,一个线程返回到它来自的交叉点并将方向标记为死亡,因此没有其他线程向下看。类似地,在到达出路时,线程返回并将其来自的方向标记为黄金,如果线程找到黄金路径,则忽略其他所有内容并沿着黄金方向到达出口并终止。

我的问题是,如果一个线程找到了一个出口,我希望它一直返回到开始的连接点,标记路上的黄金方向,然后再从处理器启动,以消耗它的处理器时间份额。目前,当处理器上的时间耗尽并且暂时从处理器中被踢出时,找到出口的线程可以在标记出路的中途得到一半,因此一些线程仍在探索迷宫的早期部分在他们出去的路上浪费时间徘徊。

如何确保刚刚找到出口的线程't'一直停留在处理器上,直到它终止为止。

提前致谢。

1 个答案:

答案 0 :(得分:4)

在完成其工作之前,您无法以编程方式保证线程保留在处理器上。线程调度是OS的特权,它在线程之间分配时间量时遵循公平规则。

如果我们深入一点,处理器本身可以决定哪些线程可以等待一段时间(例如,如果它要求的内存部分尚未缓存,则需要很长时间才能将这些数据传递给缓存),但这些延迟很小。

总的来说,你的任务看起来像是一个过度工程。除非你的迷宫非常巨大,否则标记黄金路径需要很长时间以至于真正重要(现代计算机上通常需要微秒才能改变相当大的内存状态,即使在多线程环境中),你真的很重要微秒和纳秒,你需要的只是开发一个好的迷宫行走算法,优化它,找到最适合你的线程数量,让JVM,OS和CPU完成剩下的工作。即使没有如此深刻的调整,他们也能胜任工作。

如果在此之后你仍然想对它做些什么(可能只是出于好奇),你可以使用以下策略:创建一个具有最高优先级的特殊线程并保持准备就绪。当您的一个工作线程找到黄金路径时,将其标记为该高优先级线程的任务。虽然它不能保证线程不会被踢出处理器,但它的时间量会更大。

在Java中,您可以通过ExecutorService

来实现
private final ExecutorService executor =
        Executors.newFixedThreadPool(1, r -> {
            Thread thread = new Thread(r, "golden-path-marker");
            thread.setPriority(Thread.MAX_PRIORITY);
            return thread;
        });
executor.prestartCoreThread();

后来,当你找到路径时:

executor.submit(() -> {
    // Mark the golden path here
});

但请注意,在线程之间切换是非常耗时的,因此您的迷宫必须非常大,并且标记路径对于您从这种方法中获得某些东西必定非常耗时。