当前位置: 首页 > 知识库问答 >
问题:

中断时间超过阈值的线程的最佳实践

舒阳州
2023-03-14

我的主要问题
1。带超时的get是解决此问题的最佳方法吗?
2。是否有可能我正在等待一个任务的get调用,该任务尚未被放置在线程池中(是否是一个活动的工作者)。在这种情况下,我可能正在终止一个线程,当它启动时,它实际上可能在所需的时间限制内完成?

如有任何建议,将不胜感激。

共有1个答案

潘衡
2023-03-14

>

  • 带超时的get是解决此问题的最佳方法吗?

    • 这是不够的。例如,如果您的任务不是为了响应中断而设计的,那么它将继续运行或者只是被阻止

    是否有可能我正在等待一个任务的get调用,该任务尚未被放置在线程池中(是否是一个活动的工作者)。在这种情况下,我可能正在终止一个线程,当它启动时,它实际上可能在所需的时间限制内完成?

      null
    class LongRunningTask extends Thread {
    private  Socket socket; 
    private volatile AtomicBoolean atomicBoolean;
    
    
    public LongRunningTask() {
        atomicBoolean = new AtomicBoolean(false);
    }
    
    @Override
    public void interrupt() {
        try {
            //clean up any resources, close connections etc.
            socket.close();
        } catch(Throwable e) {
        } finally {
            atomicBoolean.compareAndSet(true, false);
            //set the interupt status of executing thread.
            super.interrupt();
        }
    }
    
    public boolean isRunning() {
        return atomicBoolean.get();
    }
    
    @Override
    public void run() {
        atomicBoolean.compareAndSet(false, true);
        //any long running task that might hang..for instance
        try {
            socket  = new Socket("0.0.0.0", 5000);
            socket.getInputStream().read();
        } catch (UnknownHostException e) {
        } catch (IOException e) {
        } finally {
    
        }
    }
    }
    //your task caller thread
    //map of futures and tasks 
        Map<Future, LongRunningTask> map = new HashMap<Future, LongRunningTask>();
        ArrayList<Future> list = new ArrayList<Future>();
        int noOfSubmittedTasks = 0;
    
        for(int i = 0; i < 6; i++) {
            LongRunningTask task = new LongRunningTask();
            Future f = execService.submit(task);
            map.put(f, task);
            list.add(f);
            noOfSubmittedTasks++;
        }
    
        while(noOfSubmittedTasks > 0) {
            for(int i=0;i < list.size();i++) {
                Future f = list.get(i);
                LongRunningTask task = map.get(f);
                if (task.isRunning()) {
                    /*
                     * This ensures that you process only those tasks which are run once
                     */
                    try {
                        f.get(5, TimeUnit.MINUTES);
                        noOfSubmittedTasks--;
                    } catch (InterruptedException e) {
                    } catch (ExecutionException e) {
                    } catch (TimeoutException e) {
                                                //this will call the overridden interrupt method
                        f.cancel(true);
                        noOfSubmittedTasks--;
                    }
                }
    
            }
        }
        execService.shutdown();
    

  •  类似资料:
    • 我基本上有一个对象,它存储了一个项目的3D位置和其他属性,如速度。该位置每隔100毫秒由一个单独的威胁计算一次。另一种威胁访问这些属性并修改其中的一些属性。 我的第一个想法是简单地对每个属性使用,但据我所知,对volatile属性的每个操作都必须是原子的。由于这两种威胁都允许在某些情况下改变某些属性(如速度),这似乎不起作用。 我的下一个想法是使用Java的关键字,同步每个getter和sette

    • 本文向大家介绍浅谈ROC曲线的最佳阈值如何选取,包括了浅谈ROC曲线的最佳阈值如何选取的使用技巧和注意事项,需要的朋友参考一下 为了获取ROC曲线的最佳阈值,需要使用一个指标--约登指数,也称正确指数。 借助于matlab的roc函数可以得出计算。 至此计算结束了。 补充拓展:利用阈值分割目标图像 一.全局阈值 方法一:OTSU方法 otsu法(最大类间方差法,有时也称之为大津算法)使用的是聚类的

    • 问题内容: 和之间的实际区别是什么? 假设我希望用户会话在闲置15分钟后无效(而不是在第一次打开后15分钟内无效)。其中哪一项对我有帮助? 我也知道我可以这样做,可以将用户的Cookie设置为在一定时间内过期。但是,cookie过期与服务器端的实际会话过期是不相同的。Cookie过期后,这还会删除会话吗? 我的另一个解决方案是 对每个请求都很简单 ,然后将会话与当前时间进行比较,然后基于该时间删除

    • 问题内容: 我在Java线程方面有一些经验,但我想知道… 存储多个线程的最佳实践是什么,我可以在其中单独或成组访问这些线程? 我自己的解决方案是创建一个类,但是自然地,我希望使用更可靠的本机类。 提前致谢! 编辑 显然,功能对于最佳方法非常重要。好吧,我举一个例子: 我有一个基本上可以同时搜索大量信息的应用程序,因此我正在使用线程。但是,每个线程仅需要执行整个操作的一部分,因此我希望添加其他参数来

    • 问题内容: 作为标准代码的一部分而不是仅用于调试目的,是否存在性能或代码维护问题? 是 胜过或坏于 此外,是否有任何方法可以设置业务规则,例如始终不进行检查,因此在整个代码中的任何时候都小于0时,都会引发错误,例如,如果您在函数的开始处,函数内的任何位置进行设置哪里变得小于0引发异常? 问题答案: 为了能够在整个函数中x小于零时自动引发错误。您可以使用类描述符。这是一个例子:

    • 我有一个处理实时事件的系统。用户可以在指定的时间间隔插入自定义事件。实时引擎使用java.time.Duration来计时事件。通过jsp向用户展示一个菜单,该菜单以(全)秒为单位指定Duration。事件列表被序列化为Long值。所以我有三种使用相同值的方法。我创建了一个值对象,在每次访问时执行转换,这样我就不必将转换分散在整个代码中。我想知道是否有更好的方法来完成这个场景。这是我的VO。