Rumah > Soal Jawab > teks badan
当用LinkedBlockingQueue的take()方法获取队列信息时
一旦队列为空,则进入阻塞状态
再往队列里put()元素,take()方法会自动获取新加入元素,还是始终保持阻塞状态?
巴扎黑2017-04-18 09:46:43
Adalah disyorkan untuk melihat kod sumber dan anda akan tahu, ia sangat bermanfaat
伊谢尔伦2017-04-18 09:46:43
@wxmimperio Jawapan yang anda pakai adalah salah. ConcurrentLinkedQueue tidak menyekat, LinkedBlockingQueue menyekat. Saya akan memberikan anda kod masing-masing: seperti berikut:
import java.util.concurrent.LinkedBlockingQueue;
public class TestLinkedBlockingQueue {
public static void main(String[] args) {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
try {
queue.put("a");
queue.put("b");
System.out.println(queue.take());
System.out.println(queue.take());
System.out.println(queue.take());
queue.put("c");
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//输出结果:
//a
//b
Tetapi lihat pada ConcurrentLinkedQueue yang tidak menyekat
import java.util.concurrent.ConcurrentLinkedQueue;
public class TestConcurrentLinkedQueue {
public static void main(String[] args) {
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
queue.add("a");
queue.add("b");
System.out.println(queue.peek());
queue.remove();
System.out.println(queue.peek());
queue.remove();
System.out.println(queue.peek());
queue.remove();
queue.add("c");
System.out.println(queue.peek());
queue.remove();
}
}
//a
//b
//null
//Exception in thread "main" java.util.NoSuchElementException
// at java.util.AbstractQueue.remove(AbstractQueue.java:117)
// at TestConcurrentLinkedQueue.main(TestConcurrentLinkedQueue.java:14)