代码从顺序到线程

时间:2016-03-08 10:37:06

标签: java multithreading thread-safety

我必须说我在使用线程方面缺乏经验,如果有人能帮助我,我将不胜感激。我有这段代码,它基本上要求一个房间里所有机器的状态:

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)。

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

1 个答案:

答案 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,出错)。