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

时间:2013-04-29 22:42:25

标签: java multithreading synchronization threadpool threadpoolexecutor

我知道java线程相关的问题已被多次询问,但我无法拼凑出我的问题的答案。我仍然是线程编程的新手,所以请原谅我的无知。

我发现与一致性相关的问题,需要根据需要进行适当的同步。问题是关于在当前正在执行的线程中的对象上调用方法。考虑下面的例子(这是实验性的,所以借口任何糟糕的设计选择):

  1. 我有一个JSP,可以进行一些搜索并返回结果。必须在10秒内将响应发送给用户(无论搜索是否能够完成)。
  2. JSP创建一个ThreadPoolExecutor并使用is启动搜索线程。
  3. JSP进入睡眠状态2秒钟。
  4. JSP唤醒并检查搜索线程是否有任何结果。搜索obj提供了一个方法getCurrentResultsCount(),它返回到目前为止找到的结果计数的int。
  5. 步骤3&重复4次,然后向用户发送响应。允许搜索线程在需要的时间内继续(完成后,结果存储在servlet上下文或数据库中,以后可以访问)。
  6. 我的代码如下所示:

    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()方法有什么不对或有风险吗?它似乎在低量使用时工作正常,但如果有更高的音量,我是否会冒问题?

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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

它似乎在低量使用时工作正常,但如果有更高的音量,我是否会冒问题?

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