adh*_*dhg 4 java concurrency multithreading callable java.util.concurrent
我正在尝试更改报告的执行并将其以并发方式完成.在'serail模式'中,执行测试需要30秒,当使用并发模式时,我得到27秒(考虑到连续几步必须采取结果).
我仍然没有得到的是这一行:
ExecutorService executor = Executors.newFixedThreadPool(4);
Run Code Online (Sandbox Code Playgroud)
我的计算机装有2x2.6 Ghz四核,如果newFixedThreadPool为高(16),我希望执行时间会减少.实际上,我增加newFixedThreadPool越多,执行速度越慢.这引出了一个问题:我做错了什么或者我没理解什么?!?!
我从我的执行中嵌入了2个结果截图.
A. newSingleThreadExecuter - 在23秒内运行
B. newFixedThreadPool(4) - 在43秒内运行.
每次我提交一个'Worker'我得到system.out currentTimeMillis和'fatched tkt'结果是从db获取数据所需的毫秒数.(在策略A中 - 它需要约3毫秒,而在B中最多需要7毫秒).
Stopper stopper = new Stopper();
for (Long iNum : multimap.asMap().keySet())
{
List<Long> tickets = (List<Long>) multimap.get(iNum);
for (Long ticketNumber : tickets)
{
pojoPks = getPkData(iNum);
Callable<PojoTicket> worker = new MaxCommThread(ticketNumber, pojoPks);
Future<PojoTicket> submit = executor.submit(worker);
futures.add(submit);
}
}
System.out.println("futurues: " +futures.size());
for (Future<PojoTicket> future : futures)
{
try
{
PojoTicket pojoTicket = future.get();
//do the rest here
} catch (InterruptedException e)
{
System.out.println("---------------------->InterruptedException");
} catch (ExecutionException e)
{
System.out.println("---------------------->ExecutionException");
}
}
executor.shutdown();
stopper.stop();
Run Code Online (Sandbox Code Playgroud)
我增加newFixedThreadPool越多,执行速度越慢
通常,如果您将线程添加到作业并且不会加快速度,则可能是由于以下几种原因之一:
每个作业都必须在某种资源上进行同步,因此它们都在争夺锁争用而不是独立运行.
这些作业没有太多的CPU工作要做.将线程添加到IO绑定进程不会使事情变得更快,因为IO通道可能已经被最大化.
但是,如果您的应用程序运行速度快一半,那么这是一个有趣的情况.我只能猜测它是两者的组合.
要尝试的一件事是从1个线程开始,然后尝试2.如果它运行得不快,那么首先看看作业之间共享的锁.每个作业正在修改哪些并发集合或其他对象?尝试减少锁的数量或让线程存储临时信息,然后锁定一次以更新中心对象.
您还可以查看系统统计信息,以查看IO通道是否已超出范围.磁盘是一个常见的问题.查看是否可以在内存磁盘上运行以查看应用程序是否运行得更快.这将是您受IO约束的指标.
最后,我会研究为什么ExecutionException
当你获得工作时你得到任何s.这可能是其他一些问题的指标,但您应该首先理解这一点.