1.java并发包介绍

  JDK5.0 以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程并发编程的,充分利用了现代多处理器

和多核心系统的功能以编写大规模并发应用程序。主要包含原子量、并发集合、同步器、可重入锁,并对线程池的构造提供了强力的支持

2.线程池

  线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务

2.1.线程池的5种创建方式

  1. Single Thread Executor : 只有一个线程的线程池,因此所有提交的任务是顺序执行

  代码: Executors.newSingleThreadExecutor()

  2. Cached Thread Pool : 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,如果线程超过60秒内没执行,那么将

被终止并从池中删除,

  代码:Executors.newCachedThreadPool()

  3.  Fixed Thread Pool : 拥有固定线程数的线程池,如果没有任务执行,那么线程会一直等待,

  代码: Executors.newFixedThreadPool(4)

  在构造函数中的参数4是线程池的大小,你可以随意设置,也可以和cpu的核数量保持一致,

  获取cpu的核数量:int cpuNums = Runtime.getRuntime().availableProcessors();

  4. Scheduled Thread Pool : 用来调度即将执行的任务的线程池,可能是不是直接执行, 每隔多久执行一次... 策略型的

  代码:Executors.newScheduledThreadPool()

  5. Single Thread Scheduled Pool : 只有一个线程,用来调度任务在指定时间执行,代码:Executors.newSingleThreadScheduledExecutor()

2.2.线程池的使用

并发包中各种线程池的用法及future获取任务返回结果的机制

1.提交 Runnable ,任务完成后 Future 对象返回 null,然后调用excute,提交任务, 匿名Runable重写run方法, run方法里是业务逻辑

  1. package cn.thread;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class ThreadPoolWithRunable {
  5. /**
  6. * 通过线程池执行线程
  7. * @param args
  8. */
  9. public static void main(String[] args) {
  10. //创建一个线程池
  11. ExecutorService pool = Executors.newCachedThreadPool();
  12. for(int i = 1; i <; i++){
  13. //提交任务
  14. pool.execute(new Runnable() {
  15. @Override
  16. public void run() {
  17. System.out.println("thread name: " + Thread.currentThread().getName());
  18. try {
  19. Thread.sleep(1000);
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. });
  25. }
  26. pool.shutdown();
  27. }
  28. }

2.提交 Callable,该方法返回一个 Future 实例表示任务的状态,调用submit提交任务, 匿名Callable,重写call方法, 有返回值, 获取返回值会阻塞,一直要等

到线程任务返回结果

  1. package cn.thread;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.concurrent.Callable;
  5. import java.util.concurrent.ExecutionException;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.Executors;
  8. import java.util.concurrent.Future;
  9. /**
  10. * callable 跟runnable的区别:
  11. * runnable的run方法不会有任何返回结果,所以主线程无法获得任务线程的返回值
  12. * callable的call方法可以返回结果,但是主线程在获取时是被阻塞,需要等待任务线程返回才能拿到结果
  13. * @author
  14. */
  15. public class ThreadPoolWithcallable {
  16.  
  17. public static void main(String[] args) throws InterruptedException, ExecutionException {
  18. ExecutorService pool = Executors.newFixedThreadPool(4);
  19.  
  20. for(int i = 0; i <; i++){
  21. //提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。
  22. Future<String> submit = pool.submit(new Callable<String>(){
  23. @Override
  24. public String call() throws Exception {
  25. //System.out.println("a");
  26. Thread.sleep(5000);
  27. return "b--"+Thread.currentThread().getName();
  28. }
  29. });
  30. //从Future中get结果,这个方法是会被阻塞的,一直要等到线程任务返回结果
  31. System.out.println(submit.get());
  32. }
  33. pool.shutdown();
  34. }
  35. }

   

3.java并发包的更多相关文章

  1. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  2. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  3. Java并发包源码学习之AQS框架(一)概述

    AQS其实就是java.util.concurrent.locks.AbstractQueuedSynchronizer这个类. 阅读Java的并发包源码你会发现这个类是整个java.util.con ...

  4. 深入浅出Java并发包—锁机制(三)

    接上文<深入浅出Java并发包—锁机制(二)>  由锁衍生的下一个对象是条件变量,这个对象的存在很大程度上是为了解决Object.wait/notify/notifyAll难以使用的问题. ...

  5. 深入浅出Java并发包—锁机制(二)

    接上文<深入浅出Java并发包—锁机制(一)  >  2.Sync.FairSync.TryAcquire(公平锁) 我们直接来看代码 protected final boolean tr ...

  6. 深入浅出Java并发包—CAS机制

    在JDK1.5之前.Java主要靠synchronized这个关键字保证同步,已解决多线程下的线程不安全问题,但是这会导致锁的发生,会引发一些个性能问题. 锁主要存在一下问题 (1)在多线程竞争下,加 ...

  7. Java并发包中常用类小结(一)

    从JDK1.5以后,Java为我们引入了一个并发包,用于解决实际开发中经常用到的并发问题,那我们今天就来简单看一下相关的一些常见类的使用情况. 1.ConcurrentHashMap Concurre ...

  8. Java 并发包中的读写锁及其实现分析

    1. 前言 在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时 刻可以允许多个读线程访问,但是在写线程访问时,所有 ...

  9. Java并发包分析——BlockingQueue

    之前因为找实习的缘故,博客1个多月没有写了.找实习的经历总算告一段落,现在重新更新博客,这次的内容是分析Java并发包中的阻塞队列 关于阻塞队列,我之前是一直充满好奇,很好奇这个阻塞是怎么实现.现在我 ...

  10. 0.Java并发包系列开篇

    在我们想要谈论Java并发包(java.util.concurrent)的时候,这是一个头疼的问题,却又是每个Java工程师不得不掌握的一项技能.一直以来都想写一个Java并发包系列,无奈迟迟没有动手 ...

随机推荐

  1. python3速查参考- python基础 2 -> if语句应用 + while循环应用

    if语句应用之——求最大值 """ 求三个数字中的最大值,并打印出来 """ a = int(input("a:")) ...

  2. IntelliJ IDEA入门之常用配置以及问题解决(持续更新中)

    软件版本: IntelliJ IDEA 2019.1.1(Ultimate Edition) 运行环境: JDK1.8, Tomcat8.0, Maven3.6 我们在学习新的无论是jar包, 框架, ...

  3. vue的特点 关键字

    1.对mvvm模式的理解 Model-view-viewmodel Model数据模型 View代表ui组件 Viewmodel监听模型数据的改变和控制视图行为.处理用户交互,简单理解就是一个同步vi ...

  4. 【JulyEdu-Python基础】第 8 课:Python第三方库

    outline 数值计算 numpy 数据处理分析 pandas 可视化 matplotlib/seaborn 机器学习 Sklearn / keras 交互 pygame 网络 Selen ...

  5. Hibernate使用中防止SQL注入的几种方案

    Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数 ...

  6. 使用nginx部署项目的相关资料

    1.简单的利用nginx部署前端项目 2.ubuntu 下 Nginx 的安装和配置 3.nginx配置文件nginx.conf超详细讲解 4.Nginx 安装与部署配置以及Nginx和uWSGI开机 ...

  7. 论文阅读及复现 | Effective Neural Solution for Multi-Criteria Word Segmentation

    主要思想 这篇文章主要是利用多个标准进行中文分词,和之前复旦的那篇文章比,它的方法更简洁,不需要复杂的结构,但比之前的方法更有效. 方法 堆叠的LSTM,最上层是CRF. 最底层是字符集的Bi-LST ...

  8. 选择排序的Python代码实现

    对于a[0]~a[n]的数组, 默认a[i]最小,和后面的a[i+1]~a[n]进行比较,把最小的和a[i]交换位置,保证本次循环结束后a[i]是上一次未排序的数据中最小的 写法1 a=[12,2,2 ...

  9. JVM 和 GC

    一 堆与非堆 Java 虚拟机启动时创建一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. 在JVM中堆之外的内存称为非堆内存.. 简单来说堆就是Java代码可及的内存,是留给开发人员使 ...

  10. unity ugui image更换图片

    1:利用资源加载方式 using UnityEngine; using System.Collections; using UnityEngine.UI; public class ChangeIma ...