文档章节

架构师课程 - 3 Util.Concurrent下的工具类

业余编程人士
 业余编程人士
发布于 2017/07/08 16:14
字数 1059
阅读 11
收藏 0
点赞 0
评论 0

CountDownLatch : 监听某些初始化操作 初始化完成后 通知主线程继续工作,比如zookeeper,在开始的时候开始web要先连接一下,初始化一些实例,因此要等连接真正成功了才能初始化,所以可以用countDownLatch来监控。

        final CountDownLatch countDown = new CountDownLatch(2);
		
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("进入线程t1" + "等待其他线程处理完成...");
					countDown.await(); 
             // 等待阻塞在这里了,因为 new CountDownLatch(2)所有如果有两个线程发出countDown的时候 此线程继续
					System.out.println("t1线程继续执行...");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		},"t1");
		
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("t2线程进行初始化操作...");
					Thread.sleep(3000); // 睡眠
					System.out.println("t2线程初始化完毕,通知t1线程继续...");
					countDown.countDown(); // 发出一个countDown信号
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("t3线程进行初始化操作...");
					Thread.sleep(4000);
					System.out.println("t3线程初始化完毕,通知t1线程继续...");
					countDown.countDown(); // 发出一个countDown信号
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		
		t1.start();
		t2.start();
		t3.start();

CyclicBarrier: 每一个线程都要准备好才出发,只要有一个没准备好久都等待。多用于多台机器同一时间要执行任务时使用

static class Runner implements Runnable {  
	    private CyclicBarrier barrier;  
	    private String name;  
	    
	    public Runner(CyclicBarrier barrier, String name) {  
	        this.barrier = barrier;  
	        this.name = name;  
	    }  
	    @Override  
	    public void run() {  
	        try {  
	            Thread.sleep(1000 * (new Random()).nextInt(5));  
	            System.out.println(name + " 准备OK.");  
	            barrier.await();  // 等待,new CyclicBarrier(3) 三个运动员都准备好才放行,调用await三次
	        } catch (InterruptedException e) {  
	            e.printStackTrace();  
	        } catch (BrokenBarrierException e) {  
	            e.printStackTrace();  
	        }  
	        System.out.println(name + " Go!!");  
	    }  
	} 
	
    public static void main(String[] args) throws IOException, InterruptedException {  
        CyclicBarrier barrier = new CyclicBarrier(3);  // 3 
        ExecutorService executor = Executors.newFixedThreadPool(3);  
        
        executor.submit(new Thread(new Runner(barrier, "zhangsan")));  
        executor.submit(new Thread(new Runner(barrier, "lisi")));  
        executor.submit(new Thread(new Runner(barrier, "wangwu")));  
  
        executor.shutdown();  
    }  

CountDownlatch 是一个线程等待其他N各线程等待给我发通知 然后一个线程运行

CyclicBarrier 是多个等待互相等待 多个运行。

Callable/Future: 适用于耗时时间长。

private String para;
	
	public UseFuture(String para){
		this.para = para;
	}
	
	/**
	 * 这里是真实的业务逻辑,其执行可能很慢
	 */
	@Override
	public String call() throws Exception {
		//模拟执行耗时
		Thread.sleep(5000);
		String result = this.para + "处理完成";
		return result;
	}
	
	//主控制函数
	public static void main(String[] args) throws Exception {
		String queryStr = "query";
		//构造FutureTask,并且传入需要真正进行业务逻辑处理的类,该类一定是实现了Callable接口的类
		FutureTask<String> future = new FutureTask<String>(new UseFuture(queryStr));
		
		FutureTask<String> future2 = new FutureTask<String>(new UseFuture(queryStr));
		//创建一个固定线程的线程池且线程数为1,
		ExecutorService executor = Executors.newFixedThreadPool(2);
		//这里提交任务future,则开启线程执行RealData的call()方法执行
		//submit和execute的区别: 第一点是submit可以传入实现Callable接口的实例对象, 第二点是submit方法有返回值
		
		Future f1 = executor.submit(future);		//单独启动一个线程去执行的,线程池开的一个,非主线程
		Future f2 = executor.submit(future2);
		System.out.println("请求完毕");
		
		try {
			//这里可以做额外的数据操作,也就是主程序执行其他业务逻辑
			System.out.println("处理实际的业务逻辑...");
			Thread.sleep(1000);
		} catch (Exception e) {
			e.printStackTrace();
		}
		//调用获取数据方法,如果call()方法没有执行完成,则依然会进行等待,FutureTask是异步的。aaa先打印 future的数据后打印
		System.out.println("数据:" + future.get());
		System.out.println("数据:" + future2.get());
        System.out.println("aaa");
		
		executor.shutdown();
	}

Semaphore : 信号量适合高并发,许可进入票,限流 不过一般不推荐这样 ,因为这样效率低。

PV(page view) 网站总访问量,刷一次记一次 ,

UV (unique visitor):一个IP只记录一次

QPS(query per second): 每秒查询数,一次查询可能有好多query,可能根据这个参数看一下是否繁忙。会记录日志, 之后调优数据库 服务器等。

RT (response time): 请求相应时间。

  // 线程池  
        ExecutorService exec = Executors.newCachedThreadPool();  
        // 只能5个线程同时访问  
        final Semaphore semp = new Semaphore(5);  
        // 模拟20个客户端访问  
        for (int index = 0; index < 20; index++) {  
            final int NO = index;  
            Runnable run = new Runnable() {  
                public void run() {  
                    try {  
                        // 获取许可,只有5个线程可以进来,有一个空位 别的才能进来 ,做到限流。
                        semp.acquire();  
                        System.out.println("Accessing: " + NO);  
                        //模拟实际业务逻辑
                        Thread.sleep((long) (Math.random() * 10000));  
                        // 访问完后,释放  
                        semp.release();  
                    } catch (InterruptedException e) {  
                    }  
                }  
            };  
            exec.execute(run);  
        } 
        
        try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        
        //System.out.println(semp.getQueueLength());
        
        
        
        // 退出线程池  
        exec.shutdown();  
    }  

 

© 著作权归作者所有

共有 人打赏支持
业余编程人士
粉丝 3
博文 17
码字总数 9137
作品 0
其他
程序员
高性能产品的必由之路—性能测试工具

简介:开发人员如果具备了性能测试和性能优化的技能,在成长为架构师的路上会更加有竞争力。本门课程以Jmeter为中心给大家介绍了最最常用的性能测试的工具,通过对不同类型的系统进行性能测试...

fdhay ⋅ 2016/09/13 ⋅ 0

Linux编程学习:Linux运维必会的系统工具

×××教育,独家开创“Linux云计算架构师课程”。这是独家的全栈Linux运维课程,包含“公有云+私有云+自动化运维+Python运维开发”等核心开发技术,其中“私有云课程”较同行最全。而值得注...

长沙千锋 ⋅ 04/25 ⋅ 0

原来这样做,才能向架构师靠近

说在前面:达人课是GitChat的一款轻阅读产品,由特约讲师独家发布。每一个课程你都可获得6-12篇的深度文章,同时可在读者圈与讲师互动交流。GitChat达人课,让技术分享更简单。进入我的GitCh...

gitchat ⋅ 2017/11/14 ⋅ 0

【干货合集】看完这16篇文章,不再做敏捷项目管理上的小白!

项目管理的主流模式有哪几种? 传统项目管理通常采用的是瀑布式、部分迭代开发模式,要求在项目建设时,需求足够明确、文档足够规范,迭代过程中需求变更越多、越晚,对项目影响越大,会影响...

林一木 ⋅ 05/21 ⋅ 0

一名作曲专业毕业生的安全架构师之路

安全架构师是负责维护企业计算机系统安全的人,因此还必须具备黑客思维,能够预测攻击者非授权访问公司系统会采用的战术。处在安全架构师位置上的任何人,都有必须加班的时候,而且要随时跟进...

安全牛 ⋅ 2017/05/24 ⋅ 0

深入剖析企业级数据安全性加密、解密算法体系实战汇总

资源下载链接-https://pan.baidu.com/s/1mhZY9mC 密码: 6wrg 目前很多企业应用领域的架构师都很关注加密与解密算法在应用中的使用,譬如用户密码加密、网络协议加密等。如何在名目繁多的Jav...

huanyingmous ⋅ 2017/08/28 ⋅ 0

未来架构师_知识3.0_培训课程

与您分享... 知识3.0培训课程大纲 课程介绍及相关讲义PPT… 欢迎来信索取=>misoo.tw@qq.com 1. 高焕堂2017的在线翻转式 课堂大纲 2. 2015华为(北京)架构师创意 课程大纲 3. 腾讯(成都)创新设...

myeit ⋅ 2017/07/20 ⋅ 0

第二届研发效能嘉年华——干货满满,等你来收

为了让大家get到研发效能有关的敏捷开发和架构的相关知识,现将云栖社区2017年度与之相关的前沿技术理念及实践技术成果资料整理出来,供大家学习。 【敏捷开发】 敏捷个人和敏捷开发 敏捷开发...

林一木 ⋅ 05/09 ⋅ 0

最全的互联网分布式缓存技术视频教程(redis、memcached、ssdb)

跟着真正的互联网 架构师,学习互联网架构师方向开发!可能你还为工作不好、薪资待遇不高感到烦恼,可能你还在纠结自己的技术水平不够找不到高大上的工作而烦恼,那么在这里我们推出互联网 ...

2846613430 ⋅ 2016/04/13 ⋅ 0

2017年Linux运维人员必会开源运维工具体系

Linux运维人员必会开源运维工具体系 说明:不同的技术人员,在不同的阶段确定知识边界非常重要,否则,虽然是千里马,但是不知道终点在哪,最终累死也达不到目标。 例如:拿8K要学多少知识,...

老男孩oldboy ⋅ 2012/02/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 50分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部