0

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

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

  1. 我有一个 JSP 进行一些搜索并返回结果。响应必须在 10 秒内发送给用户(无论搜索是否能够完成)。
  2. JSP 创建一个 ThreadPoolExecutor 并使用它来启动一个搜索线程。
  3. JSP 进入睡眠状态 2 秒。
  4. JSP 唤醒并检查搜索线程是否有任何结果。搜索 obj 提供了一个 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() 方法有什么问题或风险吗?它似乎在低容量使用情况下工作正常,但如果有更高的容量,我会冒问题吗?

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

4

1 回答 1

1

以我的方式调用 getCurrentResultsCount() 方法有什么问题或风险吗?

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

它似乎在低容量使用情况下工作正常,但如果有更高的容量,我会冒问题吗?

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

于 2013-04-29T22:48:07.310 回答