在Java多線程編程中,等待隊列和阻塞隊列是常用的工具。等待隊列指的是一些線程在等待某個條件滿足,而阻塞隊列則是一些線程在等待從隊列中取出或添加元素。這兩種隊列都是線程間通信的重要手段。
等待隊列的實現可以借助Object類的wait()和notify()方法。wait()方法會讓當前線程進入等待狀態,直到其他線程調用notify()方法通知該線程條件已滿足,才能繼續執行。例如:
synchronized(Object obj) { while(!condition) { obj.wait(); } // 線程執行到這里表示條件已滿足 }
在上面的代碼中,線程會持有對象obj的鎖,進行等待直到滿足某個條件。而阻塞隊列的常用實現有ArrayBlockingQueue,LinkedBlockingQueue等。這些隊列提供了put()和take()方法,可以用來添加/取出元素。如果隊列中沒有元素或者隊列已滿,put()和take()方法會阻塞當前線程,直到隊列中有元素或空間。例如:
BlockingQueueq = new ArrayBlockingQueue<>(10); q.put("a"); // 如果隊列已滿,put()方法會阻塞當前線程 String s = q.take(); // 如果隊列為空,take()方法會阻塞當前線程
可以看到,阻塞隊列的使用簡單,同時避免了繁瑣的鎖、條件等操作。