java 多线程实现任务分发
来源:互联网 发布:开源网络监控工具 编辑:程序博客网 时间:2024/06/05 00:51
1:需要被执行的任务列表,2:启动的线程数.
存在问题:怎样知道哪个线程执行哪些任务
总共包含三个类 1:taskdistributor 任务分发器,2:待执行的任务,3:工作线程。
Taskdistributor.java
import java.util.ArrayList;
import java.util.List;
public class TaskDistributor {
public static void main(String[] args) {
List<Task> taskList = new ArrayList<Task>();
for (int i = 0; i < 56; i++) {
taskList.add(new Task(i));
}
int threadCount = 5;
List[] taskPerThreadCount = distributeTasks(taskList, threadCount);
System.out.println("实际要启动的工作线程:" + taskPerThreadCount.length);
for (int i = 0; i < taskPerThreadCount.length; i++) {
Thread workThread = new WorkThread(taskPerThreadCount[i], i);
workThread.start();
}
}
public static List[] distributeTasks(List<Task> taskList, int threadCount) {
// 每个线程至少要执行的任务数,如果不为零,则每个线程都会分到任务;
int minTaskCount = taskList.size() / threadCount;
System.out.println(minTaskCount + " minTaskCount");
// 剩下的任务数,如果不为零,则依个添加到前面的线程中.
int remainTaskCount = taskList.size() % threadCount;
System.out.println(remainTaskCount + " remainTaskCount");
// 实际要启动的线程个数,如果工作线程比较任务还多,则只需要启动与任务数相同的工作
// 线程,一对一工作,
int actualThreadCount = minTaskCount > 0 ? threadCount
: remainTaskCount;
System.out.println(actualThreadCount + " actualThreadCount");
// 要启动的线程数组,以及每个线程执行的任务列表.
List<Task>[] taskListPerThread = new List[actualThreadCount];
int taskIndex = 0;
int remainIndces = remainTaskCount;
for (int i = 0, n = taskListPerThread.length; i < n; i++) {
taskListPerThread[i] = new ArrayList();
if (minTaskCount > 0) {
for (int j = taskIndex; j < minTaskCount + taskIndex; j++) {
taskListPerThread[i].add(taskList.get(j));
}
taskIndex += minTaskCount;
}
if (remainIndces > 0) {
taskListPerThread[i].add(taskList.get(taskIndex++));
remainIndces--;
}
}
for (int i = 0, n = taskListPerThread.length; i < n; i++) {
System.out.println("线程 "
+ i
+ " 的任务数:"
+ taskListPerThread[i].size()
+ " 区间["
+ taskListPerThread[i].get(0).getTaskId()
+ ","
+ taskListPerThread[i].get(taskListPerThread[i].size() - 1)
.getTaskId() + "]");
}
return taskListPerThread;
}
}
2:task 任务:
public class Task {
private static final int READY = 0;
private static final int RUNNING = 1;
private static final int FINISHED = 2;
private int status;
private int taskId;
public Task(int taskid) {
this.status = READY;
this.taskId = taskid;
}
public void execute() {
try {
setStatus(RUNNING);
System.out.println("当前的线程ID是:" + Thread.currentThread().getName()
+ " 任务ID是:" + taskId);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setStatus(FINISHED);
}
public void setStatus(int status) {
this.status = status;
}
public int getTaskId() {
return taskId;
}
}
3: WorkThread 自定义工作线程
public class WorkThread extends Thread {
private List<Task> taskList = null;
private int threadId;
public WorkThread(List<Task> taskList, int threadid) {
this.taskList = taskList;
this.threadId = threadid;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (Task task : taskList) {
task.execute();
}
}
}
存在问题:怎样知道哪个线程执行哪些任务
总共包含三个类 1:taskdistributor 任务分发器,2:待执行的任务,3:工作线程。
Taskdistributor.java
import java.util.ArrayList;
import java.util.List;
public class TaskDistributor {
public static void main(String[] args) {
List<Task> taskList = new ArrayList<Task>();
for (int i = 0; i < 56; i++) {
taskList.add(new Task(i));
}
int threadCount = 5;
List[] taskPerThreadCount = distributeTasks(taskList, threadCount);
System.out.println("实际要启动的工作线程:" + taskPerThreadCount.length);
for (int i = 0; i < taskPerThreadCount.length; i++) {
Thread workThread = new WorkThread(taskPerThreadCount[i], i);
workThread.start();
}
}
public static List[] distributeTasks(List<Task> taskList, int threadCount) {
// 每个线程至少要执行的任务数,如果不为零,则每个线程都会分到任务;
int minTaskCount = taskList.size() / threadCount;
System.out.println(minTaskCount + " minTaskCount");
// 剩下的任务数,如果不为零,则依个添加到前面的线程中.
int remainTaskCount = taskList.size() % threadCount;
System.out.println(remainTaskCount + " remainTaskCount");
// 实际要启动的线程个数,如果工作线程比较任务还多,则只需要启动与任务数相同的工作
// 线程,一对一工作,
int actualThreadCount = minTaskCount > 0 ? threadCount
: remainTaskCount;
System.out.println(actualThreadCount + " actualThreadCount");
// 要启动的线程数组,以及每个线程执行的任务列表.
List<Task>[] taskListPerThread = new List[actualThreadCount];
int taskIndex = 0;
int remainIndces = remainTaskCount;
for (int i = 0, n = taskListPerThread.length; i < n; i++) {
taskListPerThread[i] = new ArrayList();
if (minTaskCount > 0) {
for (int j = taskIndex; j < minTaskCount + taskIndex; j++) {
taskListPerThread[i].add(taskList.get(j));
}
taskIndex += minTaskCount;
}
if (remainIndces > 0) {
taskListPerThread[i].add(taskList.get(taskIndex++));
remainIndces--;
}
}
for (int i = 0, n = taskListPerThread.length; i < n; i++) {
System.out.println("线程 "
+ i
+ " 的任务数:"
+ taskListPerThread[i].size()
+ " 区间["
+ taskListPerThread[i].get(0).getTaskId()
+ ","
+ taskListPerThread[i].get(taskListPerThread[i].size() - 1)
.getTaskId() + "]");
}
return taskListPerThread;
}
}
2:task 任务:
public class Task {
private static final int READY = 0;
private static final int RUNNING = 1;
private static final int FINISHED = 2;
private int status;
private int taskId;
public Task(int taskid) {
this.status = READY;
this.taskId = taskid;
}
public void execute() {
try {
setStatus(RUNNING);
System.out.println("当前的线程ID是:" + Thread.currentThread().getName()
+ " 任务ID是:" + taskId);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setStatus(FINISHED);
}
public void setStatus(int status) {
this.status = status;
}
public int getTaskId() {
return taskId;
}
}
3: WorkThread 自定义工作线程
public class WorkThread extends Thread {
private List<Task> taskList = null;
private int threadId;
public WorkThread(List<Task> taskList, int threadid) {
this.taskList = taskList;
this.threadId = threadid;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (Task task : taskList) {
task.execute();
}
}
}
- java 多线程实现任务分发
- java 多线程实现任务分发
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- 使用Java多线程实现任务分发
- linux 下实现简单的异步多线程任务分发
- java多线程实现任务超时监听
- Java定时多线程任务实现(TimerTask)
- java定时任务之Timer实现多线程任务
- celery实现任务统一收集、分发执行
- celery实现任务统一收集、分发执行
- 多线程实现多任务
- 多线程实现多任务
- Gearman--任务分发系统 (初探)(JAVA版)
- java多线程定时任务
- java多线程处理任务
- 安装SQL 2005/2008“性能计数器注册表配置单元一致性”失败的解决办法
- PHP文件及文件夹操作(创建,删除,移动,复制)
- Ril分析一 rild进程
- 斐波那契数列的两种实现形式
- vs2010中使用slqite及出现的问题
- java 多线程实现任务分发
- spring 项目中集成 Protocol Buffers 示例
- MapReduce之问题
- 正则表达式验证URL
- CvRNG基本随机数
- mysql中文件排序中单双路排序
- Android使用xutils图片上传和服务器接收
- python 分析网页链接 连通性
- Android学习之 基础(一)