【问题标题】:Terminate Runnable终止可运行
【发布时间】:2017-05-24 23:03:42
【问题描述】:

我有一个任务执行器,它将runnable 作为任务。我在调用runnable.run() 方法之前启动一个计时器,并在可运行完成时停止它。如果计时器超过时间限制,我想从执行程序本身终止run() 方法的执行。我不知道用户会在run() 中实现什么。

TaskExecutor.add(new Runnable () {
    @Override
    public void run() {
        System.out.println("This is test job");
    }}
);

这是用户添加新任务的方式。每个任务都在同一个线程中运行。

编辑
此任务执行器将充当用户的service。而且因为创建线程是一项昂贵的操作并且需要native 操作系统调用,所以我试图避免它们。否则我会在某个时候打电话给Thread.interrupt()。但我只想知道是否有办法终止父对象的run() 方法。终止意味着突然停止某事。就像我们如何在 OS 任务管理器中终止进程一样。

如何执行任务

while (jobQueue.isEmpty()) {
    for (Job job : jobQueue) {
       long startTime = System.currentTimeMillis();
       job.run();
       //There is a separate thread which checks
       //for timeout flags by comparing the startTime
       //with the current time. But all tasks are
       //executed in the same thread sequentially. I
       //only want to terminate single jobs that are
       //timed out.
    }
}

【问题讨论】:

  • 您无法阻止任意代码运行。该方法需要通过对中断做出反应和/或轮询某些线程安全标志的值来进行协作。不,永远,永远不要使用 Thread 的 stop() 方法,因为非常好的原因,该方法已被弃用。
  • 您也可以将 Runnable 包装到 java.util.concurrent.FutureTask 中。它有方法 public boolean cancel(boolean mayInterruptIfRunning) 并安排 get 将在成功完成时返回给定的结果。
  • @JFreeman 这个问题是关于停止线程的。那不是我打算做的。
  • @JBNizet 我无法控制用户在 run() 方法中实现的内容。此执行器用作服务。

标签: java runnable terminate


【解决方案1】:

你可以检查你的定时器的条件,如果定时器超过你可以中断你的线程——

Thread.currentThread().interrupt();

它会停止你当前的线程。

【讨论】:

  • 只有一个thread 来执行实现Runnable 的给定任务。我不想停止线程而是一个任务。
  • 然后你可以取消特定的任务,如果你想执行其他任务。如果您发布代码,这可能有助于正确理解。
【解决方案2】:

我只想知道是否有办法终止父对象的 run() 方法。

你不能真正终止一个方法,你也不能真正从一个对象做任何事情。

说“这个对象做了X”或“这个方法做了Y”通常很方便,但对象和方法实际上并没有做任何事情。当您谈论多线程代码时,重要的是要意识到您的程序所做的一切都是由线程完成的。方法只是告诉线程做什么的指令,对象是线程做什么。

你可以中断一个线程,如果线程被设计为优雅地处理中断,这只是一个好主意;你可以终止一个线程,这基本上是从来没有一个好主意。

线程应始终相互合作。您需要提供一种方法,让您的程序可以礼貌地请求客户端提供的回调以中止其工作并提前返回。如果客户端代码不尊重您的请求(即,如果客户端代码不合作),那是客户端程序员不遵守您的指导方针的错。

最简单的方法是简单地公开一些static boolean 方法,客户端可以定期检查以查看是否该中止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多