2017-08-03 28 views
0

我有6個線程訪問一個公共隊列容器,他們有這樣的在他們的run()方法:如何確保Java在某些代碼塊中不會切換線程?

if (queue.size() != 0) { 
    Element e = queue.remove(); 
    //code 

它可以作爲預期幾乎每一次,然而,曾經在一段時間的線程切換,如果檢查之間只是和remove()方法,所以其他一些線程獲取元素,並且此線程獲取NoSuchElementException。我如何確保這兩行代碼線程之間不會切換?

+1

您需要同步您的線程https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – litelite

+0

或者您可以使用線程安全隊列https://docs.oracle.com/javase /7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html – litelite

+0

[Java隊列實現,哪一個?](https://stackoverflow.com/q/1301691/669576) –

回答

3

的兩個主要選項是:

  • 通過使用​​塊
  • 使用併發收集使得兩個語句原子,例如。

對於您的情況,您可以使用a BlockingQueue,其中有幾種方法可以解決您的問題(請參閱javadoc中的表格)。根據您提供的信息,BlockinQueue::take似乎是一個很好的候選人。

0

假設它是一個BlockingQueue(它應該是正確的線程安全),你應該使用poll(long,TimeUnit)。這應該自動檢查隊列中是否有一個元素與時間段相關,如果有一個元素(如果沒有的話)返回它。

相關問題