国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

高級應用 java多線程設計模式詳解之三

2019-11-18 10:47:29
字體:
來源:轉載
供稿:網友

  前面談了多線程應用程序能極大地改善用戶相應。例如對于一個Web應用程序,每當一個用戶請求服務器連接時,服務器就可以啟動一個新線程為用戶服務。
  
  然而,創建和銷毀線程本身就有一定的開銷,假如頻繁創建和銷毀線程,CPU和內存開銷就不可忽略,垃圾收集器還必須負擔更多的工作。因此,線程池就是為了避免頻繁創建和銷毀線程。
  
  每當服務器接受了一個新的請求后,服務器就從線程池中挑選一個等待的線程并執行請求處理。處理完畢后,線程并不結束,而是轉為阻塞狀態再次被放入線程池中。這樣就避免了頻繁創建和銷毀線程。
  
  Worker Pattern實現了類似線程池的功能。首先定義Task接口:
  
  package com.crackj2ee.thread;
  public interface Task {
  void execute();
  }
  
  線程將負責執行execute()方法。注重到任務是由子類通過實現execute()方法實現的,線程本身并不知道自己執行的任務。它只負責運行一個耗時的execute()方法。
  
  具體任務由子類實現,我們定義了一個CalculateTask和一個TimerTask:
  
  // CalculateTask.java
  package com.crackj2ee.thread;
  public class CalculateTask implements Task {
  PRivate static int count = 0;
  private int num = count;
  public CalculateTask() {
  count++;
  }
  public void execute() {
  System.out.println("[CalculateTask " + num + "] start...");
  try {
  Thread.sleep(3000);
  }
  catch(InterruptedException ie) {}
  System.out.println("[CalculateTask " + num + "] done.");
  }
  }
  
  // TimerTask.java
  package com.crackj2ee.thread;
  public class TimerTask implements Task {
  private static int count = 0;
  private int num = count;
  public TimerTask() {
  count++;
  }
  public void execute() {
  System.out.println("[TimerTask " + num + "] start...");
  try {
  Thread.sleep(2000);
  }
  catch(InterruptedException ie) {}
  System.out.println("[TimerTask " + num + "] done.");
  }
  }
  
  以上任務均簡單的sleep若干秒。
  
  TaskQueue實現了一個隊列,客戶端可以將請求放入隊列,服務器線程可以從隊列中取出任務:
  
  package com.crackj2ee.thread;
  import java.util.*;
  public class TaskQueue {
  private List queue = new LinkedList();
  public synchronized Task getTask() {
  while(queue.size()==0) {
  try {
  this.wait();
  }
  catch(InterruptedException ie) {
  return null;
  }
  }
  return (Task)queue.remove(0);
  }
  public synchronized void putTask(Task task) {
  queue.add(task);
  this.notifyAll();
  }
  }
  
  終于到了真正的WorkerThread,這是真正執行任務的服務器線程:
  
  package com.crackj2ee.thread;
  public class WorkerThread extends Thread {
  private static int count = 0;
  private boolean busy = false;
  private boolean stop = false;
  private TaskQueue queue;
  public WorkerThread(ThreadGroup group, TaskQueue queue) {
  super(group, "worker-" + count);
  count++;
  this.queue = queue;
  }
  public void shutdown() {
  stop = true;
  this.interrupt();
  try {
  this.join();
  }
  catch(InterruptedException ie) {}
  }
  public boolean isIdle() {
  return !busy;
  }
  public void run() {
  System.out.println(getName() + " start.");
  while(!stop) {
  Task task = queue.getTask();
  if(task!=null) {
  busy = true;
  task.execute();
  busy = false;
  }
  }
  System.out.println(getName() + " end.");
  }
  }
  
  前面已經講過,queue.getTask()是一個阻塞方法,服務器線程可能在此wait()一段時間。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雷山县| 兴义市| 上饶市| 江口县| 南靖县| 勃利县| 新乐市| 衡阳县| 宜川县| 晋州市| 古田县| 崇阳县| 从江县| 白城市| 甘泉县| 会泽县| 务川| 汶上县| 琼结县| 信阳市| 金川县| 治县。| 桓仁| 神池县| 华蓥市| 溧水县| 五家渠市| 盐亭县| 扎鲁特旗| 手游| 通城县| 云安县| 碌曲县| 乐平市| 望奎县| 广灵县| 儋州市| 永春县| 江陵县| 名山县| 新宾|