WEB开发网
开发学院软件开发Java 关于 java.util.concurrent 您不知道的 5 件事,第... 阅读

关于 java.util.concurrent 您不知道的 5 件事,第 1 部分:通过并发 Collections 进行多线程编程

 2010-07-02 00:00:00 来源:WEB开发网   
核心提示: 集合从内部将它的内容复制到一个没有修改的新数组,这样读者访问数组内容时就不会产生同步成本(因为他们从来不是在易变数据上操作),关于 java.util.concurrent 您不知道的 5 件事,第 1 部分:通过并发 Collections 进行多线程编程(2),本质上讲,CopyOnWrit

集合从内部将它的内容复制到一个没有修改的新数组,这样读者访问数组内容时就不会产生同步成本(因为他们从来不是在易变数据上操作)。

本质上讲,CopyOnWriteArrayList 对处理 ArrayList 让我们失败这种场景是很理想的:读取频繁,但很少有写操作的集合,例如 JavaBean 事件的 Listeners。

3. BlockingQueue

BlockingQueue 界面表示它是一个 Queue,意思是它的项以先入先出(FIFO)顺序存储。在特定顺序插入的项以相同的顺序检索 — 但是需要附加保证,从空队列检索一个项的任何尝试都会阻塞调用线程,直到这个项准备好被检索。同理,想要将一个项插入到满队列的尝试也会导致阻塞调用线程,直到队列的存储空间可用。

BlockingQueue 干净利落地解决了如何将一个线程收集的项“传递”给另一线程用于处理的问题,无需考虑同步问题。Java Tutorial 的 Guarded Blocks 试用版就是一个很好的例子。它构建一个单插槽绑定的缓存,当新的项可用,而且插槽也准备好接受新的项时,使用手动同步和 wait()/notifyAll() 在线程之间发信。

尽管 Guarded Blocks 教程中的代码有效,但是它耗时久,混乱,而且也并非完全直观。退回到 Java 平台较早的时候,没错,Java 开发人员不得不纠缠于这种代码;但现在是 2010 年 — 情况难道没有改善?

清单 1 显示了 Guarded Blocks 代码的重写版,其中我使用了一个 ArrayBlockingQueue,而不是手写的 Drop。

清单 1. BlockingQueue

import java.util.*; 
import java.util.concurrent.*; 
 
class Producer 
  implements Runnable 
{ 
  private BlockingQueue<String> drop; 
  List<String> messages = Arrays.asList( 
    "Mares eat oats", 
    "Does eat oats", 
    "Little lambs eat ivy", 
    "Wouldn't you eat ivy too?"); 
     
  public Producer(BlockingQueue<String> d) { this.drop = d; } 
   
  public void run() 
  { 
    try 
    { 
      for (String s : messages) 
        drop.put(s); 
      drop.put("DONE"); 
    } 
    catch (InterruptedException intEx) 
    { 
      System.out.println("Interrupted! " + 
        "Last one out, turn out the lights!"); 
    } 
  }   
} 
 
class Consumer 
  implements Runnable 
{ 
  private BlockingQueue<String> drop; 
  public Consumer(BlockingQueue<String> d) { this.drop = d; } 
   
  public void run() 
  { 
    try 
    { 
      String msg = null; 
      while (!((msg = drop.take()).equals("DONE"))) 
        System.out.println(msg); 
    } 
    catch (InterruptedException intEx) 
    { 
      System.out.println("Interrupted! " + 
        "Last one out, turn out the lights!"); 
    } 
  } 
} 
 
public class ABQApp 
{ 
  public static void main(String[] args) 
  { 
    BlockingQueue<String> drop = new ArrayBlockingQueue(1, true); 
    (new Thread(new Producer(drop))).start(); 
    (new Thread(new Consumer(drop))).start(); 
  } 
}

上一页  1 2 3 4  下一页

Tags:关于 java util

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接