多執行緒設計模式:第六篇 - ThreadLocal和Active Object模式
阿新 • • 發佈:2018-11-06
一,ThreadLocal
Java 中的 ThreadLocal 類給多執行緒程式設計提供了一種可以讓每個執行緒具有自己獨立空間的機制,在這個空間記憶體儲的資料是執行緒特有的,不對外共享。
ThreadLocal 類提供了 set() 和 get() 方法用於設定和獲取執行緒特有資料,且 ThreadLocal 支援泛型,這樣可以通過引數來指定要儲存資料的型別。
二,Active Object模式
Active Object模式的主要目的是實現方法呼叫和執行分離到不同的執行緒中,這樣可以提高呼叫方的響應速度,同時執行方的執行策略對呼叫方透明,達到雙方互不干擾。這和之前我們說的生產者-消費者模式,Worker-Thread模式非常相似。
下面的程式示例,我們選擇使用 juc 包中的 Executor 框架來實現一個Active Object模式:
/** * @author koma <
[email protected]> * @date 2018-11-05 */ public class Main { public static void main(String[] args) { ActiveObject activeObject = ActiveObjectFactory.createActiveObject(); try { new MakerClientThread("Alice", activeObject).start(); new MakerClientThread("Bobby", activeObject).start(); Thread.sleep(5000); } catch (RejectedExecutionException e) { } catch (InterruptedException e) { } finally { activeObject.shutdown(); } } } public interface ActiveObject { public abstract Future<String> makeString(int count, char fillchar); public abstract void displayString(String s); public abstract void shutdown(); } public class ActiveObjectFactory { public static ActiveObject createActiveObject() { return new ActiveObjectImpl(); } } public class ActiveObjectImpl implements ActiveObject { private final ExecutorService executorService = Executors.newSingleThreadExecutor(); @Override public Future<String> makeString(final int count, final char fillchar) { class MakeStringRequest implements Callable<String> { @Override public String call() throws Exception { //請求的執行在另外一個執行緒中非同步執行 char[] buffer = new char[count]; for (int i = 0; i < count; i++) { buffer[i] = fillchar; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } return new String(buffer); } } return executorService.submit(new MakeStringRequest()); //提交請求並馬上返回 } @Override public void shutdown() { executorService.shutdown(); } } public class MakerClientThread extends Thread { private final ActiveObject activeObject; private final char fillchar; public MakerClientThread(String name, ActiveObject activeObject) { super(name); this.activeObject = activeObject; this.fillchar = name.charAt(0); } @Override public void run() { try { for (int i = 0; true; i++) { //使用 Future 模式獲取資料 Future<String> future = activeObject.makeString(i, fillchar); Thread.sleep(100); String value = future.get(); System.out.println(Thread.currentThread().getName()+": value = "+value); } } catch (InterruptedException e) { } catch (ExecutionException e) { } } }
1,關於 Active Object模式 的說明
Active Object模式揭示了一個事實即如果可以把方法呼叫和執行分到不同的執行緒,即跨越執行緒界線執行,那麼就可以跨越計算機執行,即透過網路在遠端計算機上執行方法。與該模式相關的 Java 技術叫 RMI。
2,POSA2 中的主動物件(Active Object)設計模式定義
主動物件(Active Object)設計模式將方法執行和呼叫分離,加強併發和簡化對駐留在自身控制執行緒中物件的同步訪問。
主動物件 別名 併發物件(Concurrent Object)