【问题标题】:How to ensure a Java thread runs until completion without interruption?如何确保 Java 线程运行直到完成而不会中断?
【发布时间】:2016-08-26 05:43:09
【问题描述】:

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

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

我的问题是,如果一个线程找到了出口,我希望它在从处理器启动以耗尽它的处理器时间份额之前,一直返回到标记黄金方向的开始交界处。目前一个找到出口的线程可以在处理器上的时间量用完并且暂时被踢出处理器时,可以通过标记出路的一半,所以一些线程仍在探索迷宫的早期部分在他们可以出去的路上浪费时间。

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

提前致谢。

【问题讨论】:

  • when it gets booted off - 这到底是什么意思?
  • 哦,对不起,没有意识到那条评论有多么含糊,希望我的编辑能澄清我的意思。
  • 对不起,也许我太天真了,但是你能不能改变你的代码,如果一个线程找到exit,那么它会设置它的quantum of time,所以它不会得到booted off
  • 你能提高线程的优先级,以确保这个线程继续前进,实际上是立即调度而不是其他线程,抢占式?
  • 你需要发布一些代码。

标签: java multithreading concurrency


【解决方案1】:

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

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

总体而言,您的任务看起来像是过度设计。除非你的迷宫非常巨大,以至于标记黄金路径需要很长时间才能真正重要(在现代计算机上,即使在多线程环境中,改变相当大块内存的状态通常也需要几微秒),你真的很重要微秒和纳秒,您所需要的只是开发一个好的迷宫行走算法,对其进行优化,找到最适合您的线程数,然后让 JVM、操作系统和 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 我认为可能是这样。一个非常深入的答案,从你所说的来看,对于我需要生产的解决方案来说,这似乎是一座太远的桥梁,如果有的话,只会产生微不足道的改进。从现在开始,我将把调度留给操作系统。
猜你喜欢
  • 1970-01-01
  • 2012-08-12
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多