等待多个并发事件完成的模型

Posted 第三方as

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了等待多个并发事件完成的模型相关的知识,希望对你有一定的参考价值。

简单的一个常见问题:如下
一个人刷牙3分钟,洗脸1分钟,梳头1分钟,煮鸡蛋5分钟。完成这些事情最少多少时间?
这其实对应编程来说就对应了题目的问题了,如何让主线程计算出多个并发事件完成的时间问题了。
我们下面会接触一个java类,那就是CountDownLatch 类,详细内容后面有时间详细添加,先下面给出一个案例代码。
下面代码只创建2个任务线程,计算完成任务最少的时间。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
package test;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

public class Test {
    public static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static void main(String[] args) {
        long start =new Date().getTime();
        CountDownLatch latch=new CountDownLatch(2);//两个任务
        DoSomething DoSomething1=new DoSomething("刷牙", 3000, latch);//模拟3秒代表3分钟
        DoSomething DoSomething2=new DoSomething("煮鸡蛋", 5000, latch);//模拟5秒代表5分钟
        DoSomething1.start(); 
        DoSomething2.start(); 
        try {
            latch.await();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }//等待所有任务完成
        System.out.println("总用时: "+(new Date().getTime()-start)/1000 +"秒");
    }


   public static class DoSomething extends Thread{
        String jobName; 
        int needTime;
        CountDownLatch latch;
        public DoSomething(String jobName ,int needTime ,CountDownLatch latch){
             this.jobName=jobName;
             this.needTime=needTime;
             this.latch=latch;
        }
        public void run(){
            System.out.println(sdf.format(new Date())+": "+jobName+"开始");
            try {
                Thread.sleep(needTime);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                System.out.println(sdf.format(new Date())+": "+jobName+"结束");
                latch.countDown();//一个任务完成
            }
        }
    }


}
  • 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
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
技术分享
  • 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
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

技术分享

 

http://bbs.bxzc123.com/forum.php?mod=viewthread&tid=244545
http://bbs.bxzc123.com/forum.php?mod=viewthread&tid=244541
http://bbs.bxzc123.com/forum.php?mod=viewthread&tid=244538
http://bbs.bxzc123.com/forum.php?mod=viewthread&tid=244527
http://bbs.bxzc123.com/forum.php?mod=viewthread&tid=244528
http://bbs.bxzc123.com/forum.php?mod=viewthread&tid=244529
http://bbs.bxzc123.com/forum.php?mod=viewthread&tid=244530







以上是关于等待多个并发事件完成的模型的主要内容,如果未能解决你的问题,请参考以下文章

Java NIOI/O模型概述

Java I/O模型

事件驱动模型

Java NIO1:浅谈I/O模型

Python并发编程-事件驱动模型

常见的网络 I/O 模型