我有6個線程訪問一個公共隊列容器,他們有這樣的在他們的run()方法:如何確保Java在某些代碼塊中不會切換線程?
if (queue.size() != 0) {
Element e = queue.remove();
//code
它可以作爲預期幾乎每一次,然而,曾經在一段時間的線程切換,如果檢查之間只是和remove()方法,所以其他一些線程獲取元素,並且此線程獲取NoSuchElementException。我如何確保這兩行代碼線程之間不會切換?
我有6個線程訪問一個公共隊列容器,他們有這樣的在他們的run()方法:如何確保Java在某些代碼塊中不會切換線程?
if (queue.size() != 0) {
Element e = queue.remove();
//code
它可以作爲預期幾乎每一次,然而,曾經在一段時間的線程切換,如果檢查之間只是和remove()方法,所以其他一些線程獲取元素,並且此線程獲取NoSuchElementException。我如何確保這兩行代碼線程之間不會切換?
的兩個主要選項是:
對於您的情況,您可以使用a BlockingQueue
,其中有幾種方法可以解決您的問題(請參閱javadoc中的表格)。根據您提供的信息,BlockinQueue::take
似乎是一個很好的候選人。
假設它是一個BlockingQueue(它應該是正確的線程安全),你應該使用poll(long,TimeUnit)。這應該自動檢查隊列中是否有一個元素與時間段相關,如果有一個元素(如果沒有的話)返回它。
您需要同步您的線程https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – litelite
或者您可以使用線程安全隊列https://docs.oracle.com/javase /7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html – litelite
[Java隊列實現,哪一個?](https://stackoverflow.com/q/1301691/669576) –