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)。
有人能告诉我如何将我的顺序代码转换为线程安全的 - 请使用一个?
您是否尝试过'CompletableFuture'并查看它是否适合您的情况?如果你感觉真的很冒险,你总是可以使用一个对象池。 – svarog
@svarog:我忘了说我使用java7 ... – Francesco
在Java 7中,您可以使用线程池或执行程序,java自带了几个实现。 – svarog