我必须说我在使用线程方面缺乏经验,如果有人能帮助我,我将不胜感激。我有这段代码,它基本上要求一个房间里所有机器的状态:
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)。
有人可以告诉我如何将我的顺序代码转换为线程安全 - 请使用一个吗?
答案 0 :(得分:1)
正如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.get()
时,主线程会一直挂起,直到您收到回复为止。
最后,我建议你看看番石榴,有很多非常实用的功能。例如,向Future添加回调(onsuccess,出错)。