gpt4 book ai didi

java - ExecutorService 和 OutOfMemoryError : unable to create new native thread while using Executor

转载 作者:行者123 更新时间:2023-12-02 03:16:24 24 4
gpt4 key购买 nike

我有一个基于 JSP 的(java)Web 应用程序。在此应用程序中,我可以通过执行外部命令,根据机器 (PC) 的 IP 询问其状态和实际操作系统。

为了加速请求,我想使用线程同时请求更多机器,即 ExecutorService。

相应 View 的 preRenderView 监听器设置为此方法,我在其中收集所有必须显示的数据。这里我初始化了执行器,它被声明为私有(private)静态类字段(private static ExecutorService executor):

public void selectData( ComponentSystemEvent event )
{
AmtRoomMachinesListController.executor = Executors.newFixedThreadPool(20);

AmtRoomMachinesListModel amtRoomMachinesListModel = (AmtRoomMachinesListModel)getModel();

List< ListRow > listRows = fetchListRows( amtRoomMachinesListModel );
...
}

fetchListRow中调用执行器并提交可调用的。然后执行器被关闭并终止:

private List< ListRow > fetchListRows( AmtRoomMachinesListModel amtRoomMachinesListModel )
{
...
List< ListRow > listRows = Collections.synchronizedList( new ArrayList< ListRow >() );

for ( Machine machine : room.getRoomPCs() )
{
executor.submit( new AmtcWorker( listRows, machine, amtRoomMachinesListModel ) );
}

executor.shutdown();

try
{
executor.awaitTermination( 20, TimeUnit.SECONDS );
}
catch ( InterruptedException e )
{
throw new BootrobotException( ExceptionType.AMTC_ERROR, "command", "Waiting for thread termination", "error", e.getMessage() );
}

((ThreadPoolExecutor)executor).purge();

LOGGER.info( "Executor is shut down: " + executor.isShutdown() );
LOGGER.info( "Executor is terminated: " + executor.isTerminated() );

sortListRows( listRows );

return listRows;
}

我的问题是进程/线程的数量不断增加,一段时间后我收到 OutOfMemory 异常。每次调用 selectData 时,进程数都会根据提示的机器数增加。

我是线程方面的新手,但我认为执行器会在调用 executor.shutdown() 或 executor.awaitTermination 或 executor.purge() 时通过终止/终止生成的线程来处理它们。

我错过了什么?

最佳答案

我的建议是只创建一个线程池。线程池旨在管理您的线程。如果每次调用方法时都创建一个线程池,那么基本上它与每次调用方法时创建线程一样糟糕,但如果您仍然坚持创建多个线程池,那么为什么不尝试一下这个相反

private List< ListRow > fetchListRows( AmtRoomMachinesListModel amtRoomMachinesListModel )
{
ExecutorService executor = Executors.newFixedThreadPool(20);
...
List< ListRow > listRows = Collections.synchronizedList( new ArrayList< ListRow >() );

for ( Machine machine : room.getRoomPCs() )
{
executor.submit( new AmtcWorker( listRows, machine, amtRoomMachinesListModel ) );
}

executor.shutdown();

try
{
executor.awaitTermination( 20, TimeUnit.SECONDS );
}
catch ( InterruptedException e )
{
throw new BootrobotException( ExceptionType.AMTC_ERROR, "command", "Waiting for thread termination", "error", e.getMessage() );
}

((ThreadPoolExecutor)executor).purge();

LOGGER.info( "Executor is shut down: " + executor.isShutdown() );
LOGGER.info( "Executor is terminated: " + executor.isTerminated() );

sortListRows( listRows );

return listRows;
}

刚刚本地化了执行器

关于java - ExecutorService 和 OutOfMemoryError : unable to create new native thread while using Executor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40219076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com