多線程下載由來已久
只研究有用的
使用Java多線程實現這種任務分發的策略是
實現及演示代碼如下
代碼中有較為詳細的注釋
package mon;
import java
import java
/**
* 指派任務列表給線程的分發器
* @author Unmi
* QQ:
* MSN:
*/
public class TaskDistributor {
/**
* 測試方法
* @param args
*/
public static void main(String[] args) {
//初始化要執行的任務列表
List taskList = new ArrayList();
for (int i =
taskList
}
//設定要啟動的工作線程數為
int threadCount =
List[] taskListPerThread = distributeTasks(taskList
System
for (int i =
Thread workThread = new WorkThread(taskListPerThread[i]
workThread
}
}
/**
* 把 List 中的任務分配給每個線程
* 返回的數組有多少個元素 (List) 就表明將啟動多少個工作線程
* @param taskList 待分派的任務列表
* @param threadCount 線程數
* @return 列表的數組
*/
public static List[] distributeTasks(List taskList
// 每個線程至少要執行的任務數
int minTaskCount = taskList
// 平均分配後還剩下的任務數
int remainTaskCount = taskList
// 實際要啟動的線程數
// 自然只需要啟動與任務相同個數的工作線程
// 畢竟不打算實現了線程池
int actualThreadCount = minTaskCount >
// 要啟動的線程數組
List[] taskListPerThread = new List[actualThreadCount];
int taskIndex =
//平均分配後多余任務
//相同的變量
int remainIndces = remainTaskCount;
for (int i =
taskListPerThread[i] = new ArrayList();
// 如果大於零
if (minTaskCount >
for (int j = taskIndex; j < minTaskCount + taskIndex; j++) {
taskListPerThread[i]
}
taskIndex += minTaskCount;
}
// 假如還有剩下的
if (remainIndces >
taskListPerThread[i]
remainIndces
}
}
// 打印任務的分配情況
for (int i =
System
taskListPerThread[i]
+ taskListPerThread[i]
+ taskListPerThread[i]
}
return taskListPerThread;
}
}
/**
* 要執行的任務
* 例如任務有三個狀態
* 要進一步完善
*/
class Task {
public static final int READY =
public static final int RUNNING =
public static final int FINISHED =
private int status;
//聲明一個任務的自有業務含義的變量
private int taskId;
//任務的初始化方法
public Task(int taskId){
this
this
}
/**
* 執行任務
*/
public void execute() {
// 設置狀態為運行中
setStatus(Task
System
+
// 附加一個延時
try {
Thread
} catch (InterruptedException e) {
e
}
// 執行完成
setStatus(FINISHED);
}
public void setStatus(int status) {
this
}
public int getTaskId() {
return taskId;
}
}
/**
* 自定義的工作線程
*/
class WorkThread extends Thread {
//本線程待執行的任務列表
private List taskList = null;
private int threadId;
/**
* 構造工作線程
* @param taskList 欲執行的任務列表
* @param threadId 線程 ID
*/
public WorkThread(List taskList
this
this
}
/**
* 執行被指派的所有任務
*/
public void run() {
for (Task task : taskList) {
task
}
}
}
執行結果如下
線程
線程
線程
線程
線程
實際要啟動的工作線程數
當前線程 ID 是
當前線程 ID 是
當前線程 ID 是
當前線程 ID 是
當前線程 ID 是
當前線程 ID 是
當前線程 ID 是
當前線程 ID 是
上面坦白來只算是基本功夫
像Java多線程的下載工具的確更充分利用了網絡資源
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27443.html