zoukankan      html  css  js  c++  java
  • 趣谈多线程

    关键字:多线程,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 }

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

  • 相关阅读:
    戴尔英语09年互联网络投放策略规划书
    haproxy相关
    邮送广告
    python和rails交互应用
    ubuntu搭建邮件服务器
    waitr自动化测试
    ruby写爬虫
    free git svn repositories
    网站开发外包遇到的问题
    电影推荐
  • 原文地址:https://www.cnblogs.com/tao_/p/2269681.html
Copyright © 2011-2022 走看看