gpt4 book ai didi

java - 如何确保一个Java线程不间断地运行直到完成?

转载 作者:行者123 更新时间:2023-11-30 06:52:17 26 4
gpt4 key购买 nike

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

我有一个程序可以生成线程来搜索迷宫的路径以找到出路。到达死胡同后,一个线程返回到它来自的连接点并将方向标记为死角,这样其他线程就不会往下看。类似地,在到达出路时,线程返回并将它来自的方向标记为金色,如果线程找到一条金色路径,它会忽略其他所有内容并沿着金色方向到达导出并终止。

我的问题是,如果线程找到导出,我希望它在从处理器启动以耗尽其处理器时间份额之前,一直返回到标记黄金方向的起始结点。目前,找到导出的线程可以在处理器上的时间用完时通过标记导出的方式进行一半,并且它暂时被踢出处理器,因此一些线程仍在探索迷宫的早期部分在他们可以出去的时候四处游荡浪费时间。

我如何确保刚刚找到导出的线程“t”一直在处理器上,直到它自行终止。

提前致谢。

最佳答案

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

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

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

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

在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
});

但请注意,线程之间的切换非常耗时,因此您的迷宫必须非常大并且标记路径必须非常耗时才能让您从这种方法中有所收获。

关于java - 如何确保一个Java线程不间断地运行直到完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39159040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com