趣谈多线程

关键字:多线程,Servlet,面向对象(Object-Oriented)

多线程,如果没有深刻的理解其本质(essential),操作起来往往会使人昏头转向。

来形象的打一个比喻,也许可以借由咱们自己已有的生活经验,轻松的理解。

张三想靠自己的踏实努力赚钱养家,他选择了卖面包Bread,现在食品安全大家都很在意,为了让客人更放心的购买,他的面包都是现做的(做面包的速度为毫秒级ms),整个流程客人都能清晰了解,早上刚开张,很快就有上班路过的白领过来买面包了。从客人提出需要,到拿到面包离开,整个过程可以大致分为以下几大步骤:

  1. 客人选择需要面包的种类;
  2. 做面包(Breadmaking);
  3. 放进面包机烤(Bread maker);
  4. 烤熟拿给客人;

……

代码表达如下:

View Code
 1 import java.util.ArrayList;
2 import java.util.List;
3
4 class Dream{
5 public static void main(String[] args){
6 final Bakery bakery = new Bakery();
7 final Dream dream = new Dream();
8 dream.justTODO(bakery);
9 }
10
11 private void justTODO(Bakery bakery){
12 do{
13 //顾客提出要面包的需求
14 //做面包
15 Bread bread = bakery.makeBread(Bread.Sort.round);
16 //顾客得到面包
17 .....
18 }while(true);
19 }
20 }
21
22 class Bakery{
23 //面包机
24 private BreadMaker breadMaker = new BreadMaker();
25
26 //制作面包
27 public Bread makeBread(Bread.Sort sort){
28 int water=1;//L
29 int flour=50;//g
30 Bread bread = new Bread(water, flour);
31 ......
32 bread = makeMoudle(bread, sort);
33 bread = breadMaker.toast(bread);
34 return bread;
35 }
36
37 //制造面包的形状
38 private Bread makeMoudle(Bread bread, Bread.Sort sort){
39 .....
40 bread.setSort(sort);
41 return bread;
42 }
43 }
44 //面包机
45 class BreadMaker{
46 //烤面包
47 public Bread toast(Bread bread){
48 .....
49 //把面包烤熟
50 bread.setState(Bread.BreadState.cooked);
51 return bread;
52 }
53 }
54
55 //面包
56 class Bread{
57 private int water;
58 private int flour;
59 private Sort sort = Sort.round;//圆形的、方形的....
60 private BreadState state = BreadState.raw;//生的或熟的
61
62 public Bread(int water, int flour){
63 this.water = water;
64 this.flour = flour;
65 }
66
67 public Sort getSort() {
68 return sort;
69 }
70
71 public void setSort(Sort sort) {
72 this.sort = sort;
73 }
74
75 public BreadState getState() {
76 return state;
77 }
78
79 public void setState(BreadState state) {
80 this.state = state;
81 }
82
83 enum BreadState{
84 cooked,//熟的
85 raw//生的
86 }
87
88 enum Sort{
89 square,
90 round
91 }
92 }

由于张三现做面包更安全的口号,吸引了很多人,现在他一个人已经忙不过来了,于是他请了一批机器人帮他做。他把做面包的流程都输入机器人,并把工作所需的工具,面、水、面包机等准备好,然后机器人就可以按部就班的生产出面包了。

代码表达如下:

View Code
  1 import java.util.ArrayList;
2 import java.util.List;
3
4 class Dream{
5 public static void main(String[] args){
6 final Bakery bakery = new Bakery();
7 final Dream dream = new Dream();
8 //引进机器人若干
9 List<Thread> robots = new ArrayList<Thread>();
10 //让机器人熟悉面包店,并写入做面包的指令
11 for(int i=0; i<10; i++){
12 Thread robot = new Thread(){
13 public void run(){
14 dream.justTODO(bakery);
15 }
16 };
17 robots.add(robot);
18 }
19 //机器人们开始工作
20 for(Thread robot : robots){
21 robot.start();
22 }
23
24 }
25
26 private void justTODO(Bakery bakery){
27 do{
28 //顾客提出要面包的需求
29 //做面包
30 Bread bread = bakery.makeBread(Bread.Sort.round);
31 //顾客得到面包
32 .....
33 }while(true);
34 }
35 }
36
37 class Bakery{
38 //面包店的公共资源-所有机器人共用的面包机
39 private BreadMaker breadMaker = new BreadMaker();
40
41 //机器人执行的逻辑-制作面包
42 public Bread makeBread(Bread.Sort sort){
43 //商店提供的资源-
44 //机器人按次排列在工作间,
45 //每个机器人面前都有水和面,不与其他机器人共用
46 int water=1;//L
47 int flour=50;//g
48 Bread bread = new Bread(water, flour);
49 ......
50 bread = makeMoudle(bread, sort);
51 bread = breadMaker.toast(bread);
52 bread = orderedToast(bread);
53 return bread;
54 }
55
56 //机器人执行的逻辑-指定各个机器人排队,依次序来使用面包机烤面包
57 private synchronized Bread orderedToast(Bread bread){
58 return breadMaker.toast(bread);
59 }
60
61 //机器人执行的逻辑-制造面包的形状
62 private Bread makeMoudle(Bread bread, Bread.Sort sort){
63 .....
64 bread.setSort(sort);
65 return bread;
66 }
67 }
68 //面包机
69 class BreadMaker{
70 //烤面包
71 public Bread toast(Bread bread){
72 .....
73 //把面包烤熟
74 bread.setState(Bread.BreadState.cooked);
75 return bread;
76 }
77 }
78
79 //面包
80 class Bread{
81 private int water;
82 private int flour;
83 private Sort sort = Sort.round;//圆形的、方形的....
84 private BreadState state = BreadState.raw;//生的或熟的
85
86 public Bread(int water, int flour){
87 this.water = water;
88 this.flour = flour;
89 }
90
91 public Sort getSort() {
92 return sort;
93 }
94
95 public void setSort(Sort sort) {
96 this.sort = sort;
97 }
98
99 public BreadState getState() {
100 return state;
101 }
102
103 public void setState(BreadState state) {
104 this.state = state;
105 }
106
107 enum BreadState{
108 cooked,//熟的
109 raw//生的
110 }
111
112 enum Sort{
113 square,
114 round
115 }
116 }

这里的张三可以理解为每个程序运行时,都需要的main thread,机器人就是可以提高操作效率的workthread。

在Servlet中,控制逻辑中继承的HttpServlet实现ContactsServlet就如同上面的Bakery(面包店)。ContactsServlet中的service方法就如同Bakery中的makeBread方法,service方法时常会在多线程环境中被调用,所以必须注意线程安全。在ContactsServlet中声明的全局变量,或者其他的一些公共资源,就如同Bakery中的Breadmaker。

View Code
1 public class ContactsServlet extends HttpServlet {
2
3 @Override
4 public void service(HttpServletRequest request, HttpServletResponse response)
5 throws ServletException, IOException {
6 //。。
7 }
8 }

一切编程的本质不是一个概念而已,而是每当遇到困难疑惑,都会主动地去思考并动手验证,从而积累成丰富的经验,丰富的经验是看清本质的基础。

posted on 2011-11-30 21:54  大松  阅读(210)  评论(0编辑  收藏  举报