Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使用多线程查询数据_Java_Multithreading_Parallel Processing - Fatal编程技术网

如何在java中使用多线程查询数据

如何在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() {

我将从机器上查询数据,每次查询50毫秒。我有一张id为的地图要查询。对于一个id,我创建一个线程。最后我有500根线

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());
    }
}