Worina008 2011-09-01 11:38
浏览 2086
已采纳

关于使用线程池控制任务超时的问题

[size=large]实现一个在规定的时间内完成一个任务,使用线程池实现,如果在规定的时间内,没完成,即结束该线程任务。以下是我的代码:

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class My {
private static ExecutorService executor = [b]Executors.newCachedThreadPool()[/b];//定义一个线程池
/**
* @param args
*/
public static void main(String[] args) {
Boolean result = false;
Future future = executor.submit(new MyJob());//将任务提交到线程池中
try {
result = future.get(200, TimeUnit.MILLISECONDS);//设定在200毫秒的时间内完成
} catch (InterruptedException e) {

        e.printStackTrace();
    } catch (ExecutionException e) {

        e.printStackTrace();
    } catch (TimeoutException e) {
        System.out.println("Time is out");//抛出超时异[size=xx-small][/size][size=large][/size]常时打印
    }
}

}

//业务job
import java.util.concurrent.Callable;
//实现Callable接口
public class MyJob implements [b]Callable[/b] {

@Override
public Boolean call() {
    //do job here
    long startTime = System.currentTimeMillis();
    for(int i=0;System.currentTimeMillis()-startTime<2000;i++){}//模拟业务执行超过2000毫秒,即已经超时
    System.out.println("continue...");
    return true;
}

}

执行void函数时输出结果如下:
Time is out
continue...

这和我的要求不符,我原本是希望在抛出异常之后任务即结束,不再执行System.out.println("continue...");
请问如何解决[/size]

  • 写回答

27条回答 默认 最新

  • weixin_42565855 2011-09-01 18:25
    关注

    [quote]在这个job中的call方法应为有for()循环可以找到在哪中断线程,但是如果只是在连接数据库的话,那就无法知道执行到哪,应该加入中断线程的代码,这应该在外面控制,而不应该在job里面实现中断[/quote]

    线程的中断在JDK1.0版本中提供了stop()方法,但这个方法极度不安全,会不管
    当前对象的状态而直接释放所有的monitor,结束线程,会导致对象处于错误的状态。
    所以已经不被推荐使用。

    试想,有个任务,A向B转账10000¥,需要先从A账户上扣款10000¥,再将B账号加
    10000¥,如果A账号扣款完,这是从外面强行杀死线程,会导致什么后果?

    中止一个线程最好的方式就是使用中断,在外面通知线程中断,线程将中断状态设置
    为true,而具体是否要中断,中断时需要如何处理以保证数据状态是正确的,这些
    应交给任务自己处理。

    在什么地方控制中断,应该任务中控制,由你的业务逻辑决定,就算是
    操作数据库也一样可以设置中断点,或者说更应该判断中断点,来决定是否回滚
    事务。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(26条)

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办