2016-03-08 38 views
0

我必须说我有veeery在线程工作的经验,如果有人能帮助我,我将不胜感激。我有这样一段代码基本上询问位于房间的所有机器的状态:代码从顺序到线程

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

您是否尝试过'CompletableFuture'并查看它是否适合您的情况?如果你感觉真的很冒险,你总是可以使用一个对象池。 – svarog

+0

@svarog:我忘了说我使用java7 ... – Francesco

+0

在Java 7中,您可以使用线程池或执行程序,java自带了几个实现。 – svarog

回答

1

正如斯瓦罗格说,有几个实现,它都与Java 7

java.util.concurrent中,你有例如类执行人,其中规定:在此基础上

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,错误)。