如何在java中使用多线程查询数据
我将从机器上查询数据,每次查询50毫秒。我有一张id为的地图要查询。对于一个id,我创建一个线程。最后我有500根线如何在java中使用多线程查询数据,java,multithreading,parallel-processing,Java,Multithreading,Parallel Processing,我将从机器上查询数据,每次查询50毫秒。我有一张id为的地图要查询。对于一个id,我创建一个线程。最后我有500根线 for (Map.Entry<String, NodeId[]> entry1 : nodeIds.entrySet()) { try { NodeId[] entrNodeIds = entry1.getValue(); new Thread() { public void run() {
for (Map.Entry<String, NodeId[]> entry1 : nodeIds.entrySet()) {
try {
NodeId[] entrNodeIds = entry1.getValue();
new Thread() {
public void run() {
new ReadRegisteredValues().getValue(entry1.getKey(), entrNodeIds[0], client);
};
}.start();
} catch (Exception e) {
fileLogger.error("failed read node: " + entry1.getKey());
}
}
但在这种情况下,我读取的值不是平行的。这是并行查询数据的最佳方法吗
有什么想法吗?您可以使用ScheduledExecutorService来为您进行调度
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(parallelism);
for (Map.Entry<String, NodeId[]> entry1 : nodeIds.entrySet()) {
Runnable checkNode = () -> getValue(entry1.getKey(), entrNodeIds[0], client);
scheduler.scheduleAtFixedRate(checkNode, 50, 50, ChronoUnit.MILLIS);
}
现在,更新将从其中一个线程每隔50毫秒执行一次。请注意,如果更新时间过长且更新次数过多,则执行队列将永远增长,最终您将遇到某种资源问题。您可以使用ScheduledExecutorService为您执行调度
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(parallelism);
for (Map.Entry<String, NodeId[]> entry1 : nodeIds.entrySet()) {
Runnable checkNode = () -> getValue(entry1.getKey(), entrNodeIds[0], client);
scheduler.scheduleAtFixedRate(checkNode, 50, 50, ChronoUnit.MILLIS);
}
现在,更新将从其中一个线程每隔50毫秒执行一次。请注意,如果更新时间过长且更新次数过多,则执行队列将永远增长,最终您将遇到某种资源问题。不完全清楚您最终要实现什么目标。您真的需要单独读取每个节点吗,或者每隔50毫秒遍历所有节点可以吗?(虽然Thread.sleep(50)显然是错误的方法)不理解getValue()方法中while循环和Thread.sleep()的必要性。您能详细说明一下吗?您还可以顺便利用ThreadPool类,这将使它更高效。@daniu我需要单独读取每个节点,每个节点都必须读取50ms@ramasCoder我每50毫秒读一次while循环中的nodeIt,它并不完全清楚你到底想要实现什么。您真的需要单独读取每个节点吗,或者每隔50毫秒遍历所有节点可以吗?(虽然Thread.sleep(50)显然是错误的方法)不理解getValue()方法中while循环和Thread.sleep()的必要性。您能详细说明一下吗?您还可以顺便利用ThreadPool类,这将使它更高效。@daniu我需要单独读取每个节点,每个节点都必须读取50ms@ramasCoder我每50毫秒读一次while循环,节点化了它,它可以工作,但是每50毫秒500个线程和500个查询是不可能的?每50毫秒500个查询看起来是这样的:每50毫秒50个查询看起来是这样的:为什么?我的电脑慢了吗?需要更多的电量吗?@ofitz这取决于你的getValue速度有多快,但我想这听起来确实有点可疑,你可以用这种方式完成500/50ms。我的getValue速度是14ms,机器可以并行处理1000个查询。所以我想我需要更多的计算机能力来每50毫秒获得500个值/查询。它可以工作,但是每50毫秒有500个线程和500个查询是不可能的?每50毫秒500个查询看起来是这样的:每50毫秒50个查询看起来是这样的:为什么?我的电脑慢了吗?需要更多的电量吗?@ofitz这取决于你的getValue速度有多快,但我想这听起来确实有点可疑,你可以用这种方式完成500/50ms。我的getValue速度是14ms,机器可以并行处理1000个查询。因此,我认为我需要更多的计算机能力,以便每50毫秒获得500个值/查询
public void getValue(String nodeName, NodeId registeredNodeId, UaClient client) {
try {
DataValue value = null;
try {
value = client.readAttribute(registeredNodeId, Attributes.Value);
} catch (ServiceException | StatusException e1) {
e1.printStackTrace();
}
TeocModel curTeocModel = new TeocModel(value.getSourceTimestamp().getTimeInMillis(), nodeName, value);
KafkaStreamer.getInstance().startStreaming(curTeocModel.toJson());
} catch (Exception e) {
fileLogger.error(e.getMessage());
}
}