线程池中如何控制超时时间?

 

线程池构造方法不能控制任务的超时时间

 java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>)

 long, java.util.concurrent.TimeUnit设置的是超过core数量的线程在没有任务时最大的idleTime

 

但是执行任务时可以使用Future类来控制超时时间

AbstractExecutorService中invokeAll,invokeAny可以指定超时时间 (没有完成的task会被cancel,并抛出interrupted异常), 但其本质还是使用Future

 

http://westyi.iteye.com/blog/714935

 

Executors 返回的线程池对象的弊端如下:

1)FixedThreadPool 和 SingleThreadPool: 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。

2)CachedThreadPool 和 ScheduledThreadPool: 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

 

 

 

线程Thread

线程工厂 ThreadFactory

线程池  正确的概念是指ThreadPoolExecutor,  注意父类AbstractExecutorService, ExecutorService中超时方法的使用

 

转载于:https://www.cnblogs.com/yszzu/p/9510498.html

.net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的ThreadID [DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)] public static extern Int32 GetCurrentWin32ThreadID(); #endregion #region 登记访问任务子线程 /// /// 访问任务子线程 /// public static Hashtable TaskThreadIDTable = Hashtable.Synchronized(new Hashtable()); private static int[] TaskThreadIDs { get { int[] IDs = new int[TaskThreadIDTable.Keys.Count]; TaskThreadIDTable.Keys.CopyTo(IDs, 0); return IDs; } } public static void RegisterThread(int _threadid, System.Threading.Thread thread) { if (!TaskThreadIDTable.ContainsKey(_threadid)) TaskThreadIDTable.Add(_threadid, thread); if (!ExitInvalidThreadLoopRunning) { Thread ExitInvalidThreadLoopThread = new Thread(new ThreadStart(ExitInvalidThreadLoop)); ExitInvalidThreadLoopThread.Priority = ThreadPriority.AboveNormal; ExitInvalidThreadLoopThread.Start(); } } #endregion #region 关闭,退出超时的用户线程 private static DateTime ExitInvalidThreadLoop_LastRunTime = DateTime.Now.Subtract(new TimeSpan(1, 0, 0, 0, 0)); private static bool ExitInvalidThreadLoopRunning { get { return DateTime.Now.Subtract(ExitInvalidThreadLoop_LastRunTime).TotalMinutes 10) { try { Thread thread = (Thread)TaskThreadIDTable[t.Id]; thread.Abort(); } catch { } t.Dispose(); } } #endregion } #endregion
### Java线程池中的线程超时机制及其使用场景 #### 线程超时的作用 在Java中,线程池通过设置线程的最大空闲时间控制资源的有效利用。如果某个线程在指定的时间内未被使用,则该线程会被终止以释放资源。这种机制有助于防止过多的线程占用内存和其他系统资源。 #### 使用场景分析 1. **高并发请求处理** 当应用程序接收到大量瞬时请求时,可以配置较大的线程池大小以便快速响应这些请求。然而,在高峰期过后,保持这么多活跃线程是没有必要的。此时可以通过设定合理的`keepAliveTime`参数让多余的线程自动销毁[^2]。 2. **定时任务执行** 对于一些周期性的后台作业,如日志清理、缓存刷新等操作,通常不需要一直维持固定数量的工作线程。相反,可以在每次任务完成后允许工作线程等待一段时间再关闭它们,从而节省不必要的开销[^3]. 3. **长时间运行的服务端应用** 长期在线的应用可能会经历流量波动的情况。为了适应不同的负载情况,合理调整线程池内的活动成员数目就显得尤为重要。适当缩短闲置线程存活期限可以帮助更好地应对突发状况下的性能需求变化[^4]. #### 实现方式举例 下面是一个简单的例子展示了如何定义带有超时特性的自定义线程工厂: ```java import java.util.concurrent.*; public class CustomThreadPoolExecutor { private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 10; private static final long KEEP_ALIVE_TIME = 60L; // 设置为60秒 public static void main(String[] args) throws InterruptedException { ThreadPoolExecutor executorService = new ThreadPoolExecutor( CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), Executors.defaultThreadFactory()); Runnable task = () -> System.out.println(Thread.currentThread().getName() + " is executing"); for (int i = 0; i < 15; ++i){ executorService.execute(task); } Thread.sleep(70_000); // 让主线程休眠足够长的时间观察效果 executorService.shutdown(); while (!executorService.awaitTermination(5, TimeUnit.SECONDS)){ System.err.println("Waiting for tasks to finish..."); } } } ``` 在这个示例程序里,设置了最大空闲时间为60秒(`KEEP_ALIVE_TIME`),这意味着任何超过这个时间段没有工作的额外线程将会被回收掉。这不仅提高了系统的灵活性也减少了不必要的资源浪费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值