关于线程超时没有太多的操作,现在只有一个简单的思路,那就是开启一个线程轮训监听所有线程池。

刚好最近在做一个项目,需要一对多进行轮训和监听,需要用到超时处理,因此特意看了一下,关键的就是开启线程,轮训查询线程执行时间,超时了直接关闭,也可以选择重开线程。

class TEST{private static final int MAX_WAIT_TIME = 8000;private static final int LOOP_TIME_OUT = 1000;private static final int CORE_POOL_SIZE = 1;private static final int INITIAL_DELAY_TIME = 0;private static final int PERIOD_TIME = 30000;private OnDataListener onDataListener;//数据回调处理private OnTimeOutListener onTimeOutListener;//超时处理private SparseArray<ScheduledThreadPoolExecutor> scheduledThreadPoolExecutor = new SparseArray<>(); //线程池集合private SparseArray<RunnableScheduledFuture> aliveThreadFutureMap = new SparseArray<>(); //线程的对象集合private ConcurrentMap<Integer, Long> aliveThreadRefreshTimeMap = new ConcurrentHashMap<>(); //每次线程执行时间private SparseIntArray mThreadKeySparse = new SparseIntArray(); //线程id集合private SparseArray<CollectBean> collectBeanSparseArray = new SparseArray<>(); //线程private int mThreadTaskNum = 0;//当前一共开了多少线程private void initData() {createTimeOutLoopTask();}private void addScheduledThreadPool(int key) {scheduledThreadPoolExecutor.put(key, ExecutorUtil.getInstance().newScheduledThreadPool(CORE_POOL_SIZE));}private void createTimeOutLoopTask() {new Thread(() -> {try {Log.i("test", "aliveThreadRefreshTimeMap=" + aliveThreadRefreshTimeMap.size());if (aliveThreadRefreshTimeMap.size() > 0) {for (int i = 0; i < mThreadKeySparse.size(); i++) {int mThreadKey = mThreadKeySparse.valueAt(i);long currentTime = System.currentTimeMillis();long refreshTimes = currentTime - aliveThreadRefreshTimeMap.get(mThreadKey);Log.i("test", mThreadKey + "==refreshTimes=" + refreshTimes);if (refreshTimes > MAX_WAIT_TIME) {closeData(mThreadKey);if (onTimeOutListener != null) {                              onTimeOutListener.onTimeOut(collectBeanSparseArray.get(mThreadKey));}}}Thread.sleep(LOOP_TIME_OUT);} else {Thread.sleep(MAX_WAIT_TIME);}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}).start();}public void openData(CollectBean collectBean) { //CollectBean 传入的对象控制着有几个线程池openModbusData(collectBean, INITIAL_DELAY_TIME, PERIOD_TIME);}private void openData(CollectBean collectBean, int initialDelay, int period) {Log.i("gss",  "openModbusData="+collectBean.getThreadKey() );if (mThreadKeySparse.indexOfValue(collectBean.getThreadKey()) < 0) {addScheduledThreadPool(collectBean.getThreadKey());}   collectBean.setTaskKey(mThreadTaskNum);aliveThreadFutureMap.put(mThreadTaskNum, (RunnableScheduledFuture) scheduledThreadPoolExecutor.get(collectBean.getThreadKey()).scheduleAtFixedRate(workerThread(collectBean, modbus, mThreadTaskNum), initialDelay, period, TimeUnit.MILLISECONDS));aliveThreadRefreshTimeMap.put(mThreadTaskNum, System.currentTimeMillis());collectBeanSparseArray.put(collectBean.getThreadKey(), collectBean);mThreadTaskNum++;}public void closeData(int mThreadKey) {Objects.requireNonNull(aliveThreadFutureMap.get(mThreadKey)).cancel(true);scheduledThreadPoolExecutor.get(mThreadKey).remove(aliveThreadFutureMap.get(mThreadKey));aliveThreadRefreshTimeMap.remove(mThreadKey);collectBeanSparseArray.remove(mThreadKey);}private Runnable workerThread(CollectBean collectBean, Modbus modbus,int i) {return () -> {try {mThreadKeySparse.put(collectBean.getThreadKey(), i);//记录当前线程的KEY,当前循环到哪个线程Thread.sleep(10000);//处理业务时间aliveThreadRefreshTimeMap.replace(i, System.currentTimeMillis());} catch (InterruptedException e) {e.printStackTrace();}};}public void setOnDataListener(OnDataListener onDataListener) {this.onDataListener = onDataListener;}public interface OnDataListener {void onProgress(CollectBean dataMap);}public void setTimeOutListener(OnTimeOutListener onTimeOutListener) {this.onTimeOutListener = onTimeOutListener;}public interface OnTimeOutListener {void onTimeOut(CollectBean collectBean);}}

线程处理任务超时处理相关推荐

  1. Monkey 导致android.anim动画线程遍历windows超时

    通过查看db.fatal.00.SWT.dbg 发现 Exception Class: SWT Exception Type: system_server_watchdog Current Execu ...

  2. 关于Hystrix超时机制和线程状态的测试观察和个人理解

    作者:未完成交响曲,资深Java工程师!目前在某一线互联网公司任职,架构师社区合伙人! 我们在使用Hystrix时,大部分情况下都是直接基于SpringCloud的相关注解来完成请求调用的.我们有个项 ...

  3. java阻塞超时_JAVA防线程阻塞(超时控制)

    2.[代码]TimeoutThread /** * java线程超时控制的实现 * * 超时控制一般使用阻塞时间比较长的操作上,有可能是和远程数据库的连接,也有可能是网络下载,在程序超时后, 往往需要 ...

  4. python强制暂停线程_关于python:使用ThreadPoolExecutor强制线程超时

    我正在升级我的代码以使用ThreadPoolExecuter,并希望能够超时需要超过几秒钟处理的任何线程. 是否可以在作为线程池一部分的线程上强制超时? 我正在使用的代码如下. 1 2 3 4 5 6 ...

  5. java 设置超时_java线程超时设置方法

    对于java中线程超时间可以使用ExecutorService与Timer来控制一个线程什么时候超时了,下面我整理了一些方法,这些文章都详细的介绍java线程超时设置技巧. 方法一 本例子使用Exec ...

  6. Python线程超时自动终止 | Python利用ThreadPoolExecutor实现对多线程的超时自动终止 | Python3实现单线程超时自动强制停止

    文章目录 1. 按 2. 实测代码 1. 按 Python多线程适用于IO密集型的应用场景,与进程不同的是多线程对计算机资源的占用较少.对于Python自带的模块,threading未实现线程池,co ...

  7. ReentrantLock+线程池+同步+线程锁

    1.并发编程三要素? 1)原子性 原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行. 2)可见性 可见性指多个线程操作一个共享变量时,其中一个线程对变量 ...

  8. 面试官问:线程池是如何重复利用空闲的线程来执行任务的?

    欢迎关注方志朋的博客,回复"666"获面试宝典 在Java开发中,经常需要创建线程去执行一些任务,实现起来也非常方便,但如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任 ...

  9. 突然就懵了!面试官问我:线程池中多余的线程是如何回收的?

    点击关注公众号,Java干货及时送达 最近阅读了JDK线程池ThreadPoolExecutor的源码,对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,别人写的比我好多 ...

最新文章

  1. 千亿参数大模型时代,QQ浏览器团队十亿级小模型「摩天」登顶CLUE
  2. 百度超级链XChain(5)XuperBridge 智能合约接口
  3. 【一】Windows API 零门槛编程指南——MessageBox 基本使用及基础讲解
  4. java运行命令解释
  5. 奥鹏东师计算机应用基础18,免费在线作业答案奥鹏东师计算机应用基础15秋在线作业1试卷及答案(1)...
  6. hdu 1708 (字符串,Fibonacci )
  7. Flutter基础—定位对齐之对齐
  8. .Net转Java自学之路—Spring框架篇二(IOC注解、AOP)
  9. DataReader,DataTable利用泛型填充实体类
  10. 第一次迭代 一次会议
  11. 【鲲鹏HCIA考试】随堂习题卷六
  12. 输入某年某月某日java_java输入某年某月某日
  13. win7 系统盘 减肥
  14. ESP32 深度睡眠模式功耗测试
  15. android视频播放异常,Android 播放视频常见问题小结
  16. TokenGazer评级丨Storj:V3 升级方案带来更好前景,但仍面临技术和竞争上的挑战...
  17. select 之分组查询
  18. swift 百度地图加载与百度地图电子围栏加载
  19. web自动化时,怎么定位鼠标悬浮时才出现的元素
  20. 曾轶可哥哥太吓人了~~~

热门文章

  1. Linux 时间/网络设置
  2. matlab帮助入口
  3. js根据数组长度生成新数组
  4. reg命令修复Win11远程提示身份验证错误 CredSSP 加密修正
  5. 连麦互动的网络直播方案
  6. 清理conda中没有用的安装包
  7. # istio 实战 五 网格可视化 - kiali
  8. 强化学习的起源:从老鼠走迷宫到AlphaGo战胜人类
  9. ubuntu 寝室拨号上网以及在家上网
  10. 小学用计算机画图单元教学要求,小学电脑绘画教学计划