Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确保Java线程在不中断的情况下一直运行到完成?_Java_Multithreading_Concurrency - Fatal编程技术网

如何确保Java线程在不中断的情况下一直运行到完成?

如何确保Java线程在不中断的情况下一直运行到完成?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有一个有趣的问题,看起来很简单,但我似乎可以在网上或stackoverflow上找到任何解决方案 我有一个程序,它可以生成线程来搜索迷宫的路径,以便找到出路。当到达死端时,一个线程返回到它所来自的连接处,并将方向标记为死端,因此没有其他线程朝下看。同样,当到达出口时,线程返回并将其来自的方向标记为金色,如果线程找到金色路径,它将忽略其他所有内容,并按照金色方向到达出口并终止 我的问题是,如果一个线程找到了出口,我希望它在被引导出处理器之前,一路返回到开始连接点,标记黄金方向,以耗尽它所占的处理

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

我有一个程序,它可以生成线程来搜索迷宫的路径,以便找到出路。当到达死端时,一个线程返回到它所来自的连接处,并将方向标记为死端,因此没有其他线程朝下看。同样,当到达出口时,线程返回并将其来自的方向标记为金色,如果线程找到金色路径,它将忽略其他所有内容,并按照金色方向到达出口并终止

我的问题是,如果一个线程找到了出口,我希望它在被引导出处理器之前,一路返回到开始连接点,标记黄金方向,以耗尽它所占的处理器时间。目前,一个已经找到出口的线程可以在处理器上的时间用完并被暂时踢出处理器时,完成标记出口的一半,因此一些仍在探索迷宫早期部分的线程会在可能的出口时浪费时间

如何确保刚刚找到出口的线程“t”在处理器上一直保持,直到其自身终止


提前感谢。

您无法通过编程保证线程在完成工作之前一直留在处理器上。线程调度是操作系统的特权,在线程之间分配时间量时遵循公平规则

如果我们深入研究,处理器本身可以决定哪个线程可以等待一段时间(例如,如果它请求一个尚未缓存的内存部分,并且将这些数据传递到缓存需要很长时间),但是这些延迟很小

总的来说,您的任务看起来像是过度工程。除非你的迷宫非常巨大,以至于标记黄金路径需要很长的时间,这真的很重要(在现代计算机上,即使在多线程环境中,改变相当大的内存块的状态通常最差也需要微秒),而且你真的需要数微秒和纳秒,你所需要的就是开发一个好的迷宫行走算法,对它进行优化,找到最适合你的线程数,让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
});

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

当它启动时
-这到底意味着什么?哦,见鬼,对不起,我没有意识到这条评论有多么模糊,希望我的编辑澄清了我的意思。对不起,也许我太天真了,但是你不能改变你的代码,这样如果一个线程找到了
退出
,那么它就会设置它的
时间量
,这样它就不会被
启动
?你能增加线程的优先级吗,这样它就能确保这个线程继续向前移动,实际上是立即安排而不是其他,先发制人?你需要发布一些代码。谢谢@AndrewLygin,我想可能是这样的。一个非常深入的回答,从你所说的来看,对于我需要的解决方案来说,这似乎是一座太远的桥梁,并且只会产生微不足道的改进,如果有的话。从现在起,我将把日程安排留给操作系统。