java concurrent包常用类小结

concurrent包是常用多线程的相关包,最近由于开发sdn程序,对于多线程使用比以前多了很多,现简单总结下。

第一类  原子类:用在多个线程共同操作一个计数的情况

AtomicLong

AtomicInteger

第二类 lock和condition

condition是从lock中得到的,所以在使用时,在执行了lock.lock()后才进行condition的操作,condition常用的两个方法await和signal。

常用在多个线程操作一个共同的资源,一个线程执行结束后,另一个线程才能执行的情况。

另外,lock应该代替以前的synchronized关键字。synchronized属于jvm层面的同步策略,由jvm进行锁的分配和释放。但是据说高并发量时,需要频繁切换线程栈,性能不好。

从今以后,代码中应该使用lock实现同步。

第三类  多线程任务执行ExecutorService

这部分大体上涉及到三个概念,

Callable     被执行的任务

Executor  执行任务()

Future      异步提交任务的返回数据 FutureTask为具体实现

线程资源是系统很珍贵的资源,的确不应该由程序员随意的new Thread方式,自己启动线程。如果项目上有自己的框架,应该使用项目框架中的线程工具,如果没有最好使用jdk提供的ExecutorService工具类。

常见的线程池

  1. ExecutorService cachedThreadPool = Executors.newCachedThreadPool();   -- 超时会销毁池中的线程
  2. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);   -- 线程池中的线程即使空闲也不销毁
  3. ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
  4. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); -- 能够定时执行任务的线程池,比如可以用在数据采集功能,每隔一小时执行一次

第四类  工具类

比如 CyclicBarrier, CountDownLatch 用来协调多个线程,执行顺序的

第五类  线程安全的集合类 比如BlockingQueue ConcurrentMap

时间: 2024-10-09 04:01:45

java concurrent包常用类小结的相关文章

java.time包常用类API学习记录

Java8出来已那么多年了,java.time包之前一直没有使用过,最近正好有用到,在此做个记录. 上图列出了java.time包下的类,接下来我们详细看下其中每个类的用法. Clock:获取到当前时间点,包含时区信息,该类是抽象类,其实现类由其内部类实现,也可以自定义其实现类. Clock方法描述: getZone():获取创建日期时间的时区: withZone(ZoneId zone):返回一个指定时区clock副本: instant():返回instant实例: millis():获取当前

java io包File类

1.java io包File类, Java.io.File(File用于管理文件或目录: 所属套件:java.io)1)File对象,你只需在代码层次创建File对象,而不必关心计算机上真正是否存在对象文件. file类的几个常用方法:file.canRead() boolean ,file.canWrite() boolean,file.canExecute() boolean,file.createNewFile() boolean.(1)file.createNewFile() boole

转:java中包、类、方法、属性、常量的命名规则

必须用英文,不要用汉语拼音 1:包(package):用于将完成不同功能的类分门别类,放在不同的目录(包)下,包的命名规则:将公司域名反转作为包名.比如www.sohu.com 对于包名:每个字母都需要小写.比如:com.sohu.test;该包下的Test类的全名是:com.sohu.Test.java . 如果定义类的时候没有使用package,那么java就认为我们所定义的类位于默认包里面(default package). 2:类:首字母大写,如果一个类由多个单词构成,那么每个单词的首字

利用java concurrent 包实现日志写数据库的并发处理

一.概述 在很多系统中,往往需要将各种操作写入数据库(比如客户端发起的操作). 最简单的做法是,封装一个公共的写日志的api,各个操作中调用该api完成自己操作日志的入库.但因为入数据库效率比较低,如果每个操作自己入库,则会影响响应速度.而且当操作并发度很高时,往往同时有多个线程在写数据库,也会对系统有影响. 考虑的解决方案是,这个api并不实际完成入库,而是将每个操作日志信息写到一个公共的缓存中,然后应用系统起了一个独立的线程(一直运行)在后台进行入库.如果当前缓存中有记录,就写库,没有记录,

java concurrent包介绍及使用

说一说java的concurrent包1-concurrent包简介 前面一个系列的文章都在围绕hash展开,今天准备先说下concurrent包,这个系列可能会以使用场景说明为主,concurrent包本身的代码分析可能比较少: 我在这方面的实践经验较为有限,有错误欢迎批评指正 不过前一个系列并未结束,还有一些文章没有放出来,欢迎关注核桃博客 concurrent包是jdk1.5引入的重要的包,主要代码由大牛Doug Lea完成,其实是在jdk1.4时代,由于java语言内置对多线程编程的支持

java concurrent包的实现原理

由于java的CAS同时具有 volatile 读和volatile写的内存语义,因此Java线程之间的通信现在有了下面四种方式: A线程写volatile变量,随后B线程读这个volatile变量. A线程写volatile变量,随后B线程用CAS更新这个volatile变量. A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volatile变量. A线程用CAS更新一个volatile变量,随后B线程读这个volatile变量. Java的CAS会使用现代处理器上提供的

java 中的常用类

Java 中的包装类 相信各位小伙伴们对基本数据类型都非常熟悉,例如 int.float.double.boolean.char 等. 基本数据类型是不具备对象的特性的,比如基本类型不能调用方法.功能简单..., 为了让基本数据类型也具备对象的特性, Java 为每个基本数据类型都提供了一个包装类,这样我们就可以像操作对象那样来操作基本数据类型. 包装类主要提供了两大类方法: 1. 将本类型和其他基本类型进行转换的方法 2. 将字符串和本类型及包装类互相转换的方法 Integer 常用的方法 p

JAVA异常处理、常用类、反射、集合

异常 异常:在Java中是指被一个方法抛出的对象. 分类:检查异常.运行时异常.错误 运行时异常(uncheckd):RuntimeException和其子类 检查异常(checkd/搜检异常):指Exception和其子类,且不是RuntimeException的子类:它必须经过处理才会找到 语法: try{ //被保护的代码 }catch(异常的名称 e1){ //捕获块 } 注意:应先捕获特殊再捕获一般异常:try没有出现异常catch将不会执行 异常处理的三种选择: 1)捕获这个异常,不

java基础教程-常用类(四)

四.常用类 4.1字符串相关的类(String StringBuffer) 4.1.1String类   4.1.2StringBuffer类(代表可变的) 解释一下可变和不可变 String s1 = “hello”; String s2 = “world”; s1+=s2; 实际上又开辟了一块内存,将hello和world copy进去,s1指向新的内存 而StringBuffer只是在s1后面增加了一块内存,把world加上,不需要copy String与StringBuffer只有这一定