和风细雨
世上本无难事,心以为难,斯乃真难。苟不存一难之见于心,则运用之术自出。
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2008年2月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1
2
3
4
5
6
7
8
统计
随笔 - 97
文章 - 1
评论 - 26
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
CSS(8)
(rss)
DataBase/SQL
(rss)
EJB
(rss)
Hibernate(9)
(rss)
J2EE(1)
(rss)
J2SE(15)
(rss)
JavaScript(5)
(rss)
Jsp/Servlet(1)
(rss)
OOP(3)
(rss)
Spring
(rss)
Struts(1)
(rss)
Swing(9)
(rss)
XML(2)
(rss)
正则表达式(3)
(rss)
算法(7)
(rss)
线程(8)
(rss)
随笔档案
2008年8月 (1)
2008年5月 (1)
2008年4月 (9)
2008年3月 (31)
2008年2月 (54)
文章档案
2007年2月 (1)
相册
11
搜索
最新评论
1. re: C/S架构和B/S架构的概念和区别[未登录]
谢谢介绍!:)
--alex
2. re: JTabbedPane选项窗格的使用
我下载了~,谢谢了~
--YGZ
3. re: JTabbedPane选项窗格的使用
楼主,可以把你做的JTabbedPane例子发我吗,做的真的很不错,我的邮箱:shuishou198709@163.com
真的感谢了!
--YGZ
4. re: Java中参数传递是传值还是传址?
评论内容较长,点击标题查看
--冶人
5. re: Hashtable基本用法概述
简单易懂~~~~~~~~~~~~~~~~~~~~~~
--hasunjun
阅读排行榜
1. Hashtable基本用法概述(1456)
2. 使用JavaScript操作表单(795)
3. JTable常见用法细则(711)
4. C/S架构和B/S架构的概念和区别(704)
5. JTabbedPane选项窗格的使用(648)
评论排行榜
1. JTabbedPane选项窗格的使用(6)
2. JTree树控件的使用(5)
3. 使用JavaScript操作表单(2)
4. C/S架构和B/S架构的概念和区别(2)
5. Java中参数传递是传值还是传址? (2)
工序任务的线程模拟
工序任务指流水线式的工作场景,下一组工人的工件就是上一组工人的成品,一个活做完自己的部分就往下传,直到活完成为止。
为了编程方便简化了各个工序的工时,把它们都当成一样的了。
代码:
package
com.sitinspring.autotask.domain;
import
com.sitinspring.autotask.util.IdUtil;
/** */
/**
* 任务类
*
* @date: 2008-2-25
*/
public
class
Task
implements
Comparable
{
private
String id;
private
String name;
//
完成需消耗的工时数
private
int
manHour;
//
已经完成的工时数
private
int
completed;
//
接受任务者
private
Worker worker;
public
Task(String name,
int
manHour)
{
id
=
IdUtil.generateId();
this
.name
=
name;
this
.manHour
=
manHour;
this
.completed
=
0
;
}
//
任务是否完成
public
boolean
isCompleted()
{
return
completed
>=
manHour;
}
//
添加完成度
public
void
addCompleted(
int
n)
{
completed
+=
n;
if
(isCompleted())
{
completed
=
manHour;
if
(worker
!=
null
)
{
System.out.println(
"
任务
"
+
this
+
"
处理完毕!
"
);
}
}
}
public
int
compareTo(Object obj)
{
Task another
=
(Task) obj;
return
(another.manHour)
-
this
.manHour;
}
public
String toString()
{
//
return "任务名:" + name ;
//
+ " 工人名:" + worker.getName() + " 完成度:" + completed* 100 / manHour + "%";
return
name;
}
public
String getCompletedRatio()
{
return
"
完成度:
"
+
completed
*
100
/
manHour
+
"
%
"
;
}
public
int
getCompleted()
{
return
completed;
}
public
void
setCompleted(
int
completed)
{
this
.completed
=
completed;
}
public
int
getManHour()
{
return
manHour;
}
public
void
setManHour(
int
manHour)
{
this
.manHour
=
manHour;
}
public
String getName()
{
return
name;
}
public
void
setName(String name)
{
this
.name
=
name;
}
public
String getId()
{
return
id;
}
public
Worker getWorker()
{
return
worker;
}
public
void
setWorker(Worker worker)
{
this
.worker
=
worker;
}
}
package
com.sitinspring.autotask.domain;
import
java.util.LinkedList;
import
java.util.List;
/** */
/**
* 任务库类
*
*
@author
sitinspring
*
*/
public
class
TaskLibrary
{
private
List
<
Task
>
tasks;
private
String name;
public
TaskLibrary(String name)
{
this
.name
=
name;
tasks
=
new
LinkedList
<
Task
>
();
}
//
添加单个任务
public
synchronized
void
addTask(Task task)
{
tasks.add(task);
printTasks();
notifyAll();
}
//
添加多个任务
public
synchronized
void
addTasks(List
<
Task
>
moreTasks)
{
tasks.addAll(moreTasks);
printTasks();
notifyAll();
}
/** */
/**
* 打印现有任务
*
*/
public
void
printTasks()
{
if
(tasks
==
null
)
{
System.out.println(
"
无任务
"
);
return
;
}
StringBuffer sb
=
new
StringBuffer();
for
(Task task:tasks)
{
sb.append(task
+
"
,
"
);
}
System.out.println(name
+
"
现有任务:
"
+
sb.toString());
}
public
int
getTaskSize()
{
return
tasks.size();
}
//
工人领受任务
public
synchronized
Task fetchTask(Worker worker)
{
while
(tasks.size()
==
0
)
{
try
{
System.out.println(name
+
"
中任务告罄
"
);
System.out.println(name
+
"
中工人:
"
+
worker.getName()
+
"
进入闲置状态
"
);
wait();
}
catch
(InterruptedException ex1)
{
ex1.printStackTrace();
}
}
Task task
=
tasks.get(
0
);
System.out.println(
"
工人:
"
+
worker.getName()
+
"
从
"
+
name
+
"
中取得任务:
"
+
task.getName());
tasks.remove(task);
return
task;
}
public
String getName()
{
return
name;
}
}
package
com.sitinspring.autotask.domain;
import
com.sitinspring.autotask.util.IdUtil;
/** */
/**
* 工人类,用于完成一个”活“
*
@author
sitinspring
*
* @date 2008-2-25
*/
public
class
Worker
implements
Runnable
{
/** */
/**
* 工人ID
*/
private
String id;
/** */
/**
* 工人名
*/
private
String name;
/** */
/**
* 当前任务
*/
private
Task currTask;
/** */
/**
* 未完成工件来源的库
*/
private
TaskLibrary srcLib;
/** */
/**
* 已完成工件去向的库
*/
private
TaskLibrary destLib;
//
工作速度
private
int
speed;
public
Worker(String name,
int
speed, TaskLibrary srcLib,TaskLibrary destLib)
{
id
=
IdUtil.generateId();
this
.currTask
=
null
;
this
.name
=
name;
this
.speed
=
speed;
this
.srcLib
=
srcLib;
this
.destLib
=
destLib;
doWork();
}
//
开始干活
public
void
doWork()
{
Thread thread
=
new
Thread(
this
);
thread.start();
}
//
真正干活
public
void
run()
{
while
(
true
)
{
if
(currTask
==
null
||
currTask.isCompleted())
{
if
(currTask
!=
null
&&
currTask.isCompleted())
{
System.out.println(
"
工人:
"
+
name
+
"
向
"
+
destLib.getName()
+
"
中放置任务:
"
+
currTask.getName());
currTask.setCompleted(
0
);
destLib.addTask(currTask);
}
currTask
=
srcLib.fetchTask(
this
);
currTask.setWorker(
this
);
}
try
{
Thread.sleep(
1000
);
//
暂停一秒,模拟现实中的加工过程
System.out.println(
"
工人
"
+
name
+
"
正在处理任务
"
+
currTask
+
"
完成度
"
+
currTask.getCompletedRatio()
+
"
.
"
);
currTask.addCompleted(speed);
}
catch
(Exception ex)
{
ex.printStackTrace();
}
}
}
public
String getName()
{
return
name;
}
public
void
setName(String name)
{
this
.name&nbs