Tag: 线程池

没有队列的ThreadPoolExecutor

我想创建一个固定大小的线程池,不允许任何任务进入其队列。 换句话说,如果当前正在使用线程池,则应该完全拒绝传入的任务。 基于文档 ,在我看来,实现此目的的一种方法是创建一个拒绝接受任务的虚拟Queue对象。 在Java中实现这一目标的惯用方法是什么?

为什么ScheduledExecutorService在抛出exception后不再运行任务?

为了执行定期任务,我查看了Timer和ScheduledThreadPoolExecutor (使用单个线程)并决定使用后者,因为在reference for Executors.newSingleThreadScheduledExecutor()的reference for Executors.newSingleThreadScheduledExecutor() ,它说: 但请注意,如果此单个线程由于在关闭之前执行期间的故障而终止,则在需要执行后续任务时将使用新线程。 我的计划是使用它作为一个保护措施,以防止我希望监视其他操作的监视程序代码中未被捕获的exception。 我想确认并编写下面的测试,该测试很快就失败了。 看来我做错了假设,或者我的测试出了什么问题? 这是代码: @Test public void testTimer() { final AtomicInteger cTries = new AtomicInteger(0); final AtomicInteger cSuccesses = new AtomicInteger(0); TimerTask task = new TimerTask() { @Override public void run() { cTries.incrementAndGet(); if (true) { throw new RuntimeException(); } cSuccesses.incrementAndGet(); } }; /* Timer t = […]

Java Threadpool与高请求场景中的新线程

我有一些旧的Java代码用于REST服务,它为每个传入的请求使用一个单独的线程。 即主循环将在socket.accept()上循环并将套接字移交给Runnable,然后Runnable将启动其自己的后台线程并调用自身运行。 直到最近,我才注意到这种情况令人钦佩,我注意到在高负荷下接受处理请求的滞后将变得不可接受。 当我钦佩地说,我的意思是它在没有大量CPU使用的情况下每秒处理100-200个请求。 当其他守护进程添加负载时性能只会降低,然后只有一次负载超过5.当机器处于高负载(5-8)时,其他进程的组合,从接受到处理的时间会变得非常高( 500ms到3000ms)而实际处理时间不到10ms。 这一切都在双核centos 5系统上。 已经习惯了.NET上的Threadpools,我认为线程创建是罪魁祸首,我认为我在java中应用了相同的模式。 现在我的Runnable使用ThreadPool.Executor执行(并且池使用和ArrayBlockingQueue)。 同样,它在大多数情况下工作得很好,除非机器负载变高,然后从创建runnable到run()被调用的时间表现出大致相同的荒谬时间。 但更糟糕的是,随着线程池逻辑的到位,系统负载几乎翻了一番(10-16)。 所以现在我得到了相同的延迟问题,负载加倍。 我怀疑队列的锁争用比先前没有锁的新线程启动成本更差。 任何人都可以分享他们的新线程与线程池的经验。 如果我的怀疑是正确的,任何人都有另一种方法来处理没有锁争用的线程池? 我很想让整个系统单线程化,因为我不知道我的线程有多大帮助,IO似乎不是一个问题,但我确实得到了一些长期存在的请求阻止一切。 谢谢,阿恩 更新:我切换到Executors.newFixedThreadPool(100); 虽然它保持相同的处理能力,但是加载几乎立即加倍并且运行12小时显示负载始终保持2倍。 我想在我的情况下,每个请求的新线程更便宜。

java调度以伪’固定’速率调用(例如钟形曲线分布)

目前我有一个ScheduledThreadPoolExecutor,它可以以固定的速率执行callable。 scheduledThreadPoolExecutor.scheduleAtFixedRate(callable, delay, waitNano, TimeUnit.NANOSECONDS); 我的团队想在waitNano中添加一些randomess。 目前它是1000.但我们希望等待秒数为900,1100,800,1200。 平均等待时间仍然是1000,但等待秒是随机分布的(例如像Bell曲线)。 我想知道这个function已经在java了吗? 如果我必须编写自己的“调度程序”,这种行为具有随机等待行为,那么你们有什么建议呢? 非常感谢! 厄尔本

如何解决Java错误“pool-1-thread-xxxx”java.lang.OutOfMemory

我已经搜索了关于这个问题的post,但我没有看到像我这样的情况。 我的java控制台显示错误消息”pool-1-thread-xxxx” java.lang.OutOfMemory如下图所示: 红线:CPU使用率 绿线:内存使用情况 我已将RAM从6G增加到10G ,并在启动程序之前在*.bat文件中设置-Xms=8G -Xmx=8G -Xmn=3G 。 我也一直在观看性能监视器,但内存总是在20%左右。 我不知道怎么会发生这种情况。 任何的想法? 这是我的run.bat代码。 @echo off javapro @java -Xoptimize -Xms8G -Xmx8G -Xmn3G -Xss1024k -XX:+UseConcMarkSweepGC -cp javaPro.exe; cls run.bat 操作系统:Windows Server 2012 R2 Java版本:jre1.8.0_171 RAM:10G CPU:2.5 GHz Intel Xeon(R)(超线程)