为了账号安全,请及时绑定邮箱和手机立即绑定

创建线程已经返回后如何在 Java 线程处超时?

创建线程已经返回后如何在 Java 线程处超时?

元芳怎么了 2022-05-21 13:46:47
我正在尝试编写一个方法来创建一个线程,该线程在该方法已经返回后可以工作。我需要这个线程在一定时间后超时。我有一个可行的解决方案,但我不确定这是否是最好的方法。  new Thread(() -> {        ExecutorService executor = Executors.newSingleThreadExecutor();        Future<Void> future = executor.submit(new Callable() {            public Void call() throws Exception {              workThatTakesALongTime();        });        try {            future.get(timeoutMillis, TimeUnit.MILLISECONDS);        } catch (Exception e) {            LOGGER.error("Exception from timeout.", e);        }    }).start();有没有更好的方法来做到这一点而不使用线程中的 ExecutorService ?
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

请参阅ExecutorService.invokeAny()允许您传递超时值的方法。



查看完整回答
反对 回复 2022-05-21
?
函数式编程

TA贡献1807条经验 获得超9个赞

有多种方法可以实现这一点。正如您所做的那样,一种方法是使用 ExecutorService。一个更简单的方法是创建一个新线程和一个队列,如果每隔几秒就有一些东西,线程就会从中查找。一个例子是这样的:


Queue<Integer> tasks = new ConcurrentLinkedQueue<>();


new Thread(){

    public void run() throws Exception {

        while(true){

            Integer task = null;


            if((task = tasks.poll()) != null){

                // do whatever you want

            }


            Thread.sleep(1000L); // we probably do not have to check for a change that often

        }

    }

}.start();



// add tasks

tasks.add(0);


查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号