gpt4 book ai didi

java - 从正在运行的线程读取数据

转载 作者:行者123 更新时间:2023-12-01 14:38:06 25 4
gpt4 key购买 nike

我知道与java线程相关的问题已经被问过很多次了,但我一直无法拼凑出我的问题的答案。我对线程编程还是新手,所以请原谅我的无知。

我了解与一致性相关的问题,并且需要根据需要进行适当的同步。问题是关于调用当前正在执行的线程中的对象的方法。考虑以下示例(这是实验性的,因此请原谅任何糟糕的设计选择):

  1. 我有一个 JSP,可以执行一些搜索并返回结果。响应必须在 10 秒内发送给用户(无论搜索是否能够完成)。
  2. JSP 创建一个 ThreadPoolExecutor 并使用它来启动搜索线程。
  3. JSP 进入 hibernate 状态 2 秒。
  4. JSP 唤醒并检查搜索线程是否有任何结果。搜索对象提供了 getCurrentResultsCount() 方法,该方法返回迄今为止找到的结果计数的 int 值。
  5. 步骤 3 和 4 重复 5 次,然后将响应发送给用户。只要需要,搜索线程就可以继续运行(完成后,结果存储在 servlet 上下文或数据库中,稍后可以访问)

我的代码如下所示:

ThreadPoolExecutor pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
SearchWidget searchWidget = new SearchWidget(searchTerm);
Future<?> searchWidgetFuture = pool.submit(searchWidget);
Thread.sleep(2000);
System.out.println("1. Results so far:" + searchWidget.getCurrentResultsCount());
Thread.sleep(2000);
System.out.println("2. Results so far:" + searchWidget.getCurrentResultsCount());
Thread.sleep(2000);
System.out.println("3. Results so far:" + searchWidget.getCurrentResultsCount());
...
...

按照我的方式调用 getCurrentResultsCount() 方法是否有任何错误或风险?它似乎在低容量使用时工作正常,但如果使用量较高,我是否会面临问题的风险?

非常感谢任何帮助。谢谢!

最佳答案

Is there anything wrong or risky with invoking the getCurrentResultsCount() method the way I'm doing it?

不,只要 getCurrentResultsCount() 访问某个同步字段就没有问题,因为共享数据是在两个不同的线程中更新和访问的。我建议使用 AtomicInteger 来存储此类信息。

It seems to be working fine on low volume usage, but am I risking issues if there is higher volume?

您因更新 volatile 字段(在AtomicInteger内部)而付出了性能损失,但它相对较小。表面上没有什么可担心的。后台任务数量的增加将明显掩盖 JSP 和线程之间的任何数据共享。

关于java - 从正在运行的线程读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16289452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com