gpt4 book ai didi

java - 代码从顺序到线程

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

我必须说我在使用线程方面几乎没有经验,如果有人可以帮助我,我将不胜感激。我有这段代码,它基本上询问房间中所有机器的状态:

private List< ListRow > fetchListRows( Model amtRoomMachinesListModel )
{
Room room = RoomHelper.getRoomByDbId(...);

List< ListRow > listRows = new ArrayList<>();

for ( Machine machine : room.getRoomPCs() )
{
setMachineStatus( machine );

if ( amtRoomMachinesListModel.getState() == null
|| amtRoomMachinesListModel.getState().equalsIgnoreCase( machine.getState().getLabel() ) )
{
ListRow listRow = new ListRow( false, machine );

listRows.add( listRow );
}
}

sortListRows( listRows );

return listRows;
}


private void setMachineStatus( Machine machine )
{
State retrievedMachineState = State.ERROR;
String machineName = "";

try
{
machineName = AMTCHelper.ip2MachineName( machine ); // executes a nslookup

retrievedMachineState = AMTCHelper.retriveMachineState( retrievedMachineState, machineName ); // executes an external C program and read the response
}
catch ( IOException | InterruptedException | ParseException e )
{
throw new BRException( ExceptionType.AMTC_ERROR, "command", String.format(AMTCHelper.getRetriveMachineStateCommand(), machineName ) , "error", e.getMessage() );
}

machine.setState( retrievedMachineState );
}

由于状态请求的响应时间为 4 到 10 秒,并且一个房间中的机器数量可能超过 100 台,我认为使用线程“同时”启动多台机器的进程可能会很有用' 列表,以便整体处理时间明显缩短。

我忘了说我使用 java 7(而不是 8)。

有人可以告诉我如何将我的顺序代码转换为线程安全的代码吗?请使用一个?

最佳答案

正如 svarog 所说,Java 7 附带了多种实现。

在 java.util.concurrent 中,您有 Executor 类,它提供:

ExecutorService service = Executors.newFixedThreadPool(nbThreads);

基于此,您可以使用java.util.concurrent.Future

for ( Machine machine : room.getRoomPCs() )
{
Callable<State> process = new Callable<Integer>() {
//whatever you do to retrieve the state
return state;
}

// At this point, the process begins if a thread is available
Future<State> future = service.submit(process);
}

该过程在submit()上运行。您可以通过这种方式创建 future 列表。当您调用 future.get() 时,主线程会挂起,直到您收到响应。

最后,我建议你看看guava,有很多非常有用的功能。例如,向 Future 添加回调(成功时、错误时)。

关于java - 代码从顺序到线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35865069/

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