Java 线程池和多线程编程 ——线程池理解与创建

JDK1.5 引入了 Executor框架 ,对任务提交和执行进行解耦 , 定义任务后交由线程池执行。

线程池是由java.util.concurrent 包中Executors类的工厂方法创建线程池。

--------------------------------------------------------------------------------

创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。

public static ExecutorService newFixedThreadPool(int nThreads)  nThreads - 池中的线程数

 ExecutorService pool = Executors.newFixedThreadPool(6);
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。public static ExecutorService newSingleThreadExecutor()
ExecutorService threadPool = Executors.newSingleThreadExecutor();

创建一个安排在给定延迟后运行命令或者定期地执行的拥有3个线程的线程池。

 初始延迟为6秒 , 间隔定时为2秒 的定时任务。

  Executors.newScheduledThreadPool(3).scheduleAtFixedRate( ()-> {
                    System.out.println("bombing!");
                    }, 6, 2, TimeUnit.SECONDS);
    }
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。public static ExecutorService newSingleThreadExecutor()

--------------------------------------------------------------------------------

线程池框架提供了两种方式提交任务,根据不同的业务需求选择不同的方式。

①  Executor.execute()

   void execute(Runnable command)

在未来某个时间执行给定的命令。该命令可能在新的线程、已入池的线程或者正调用的线程中执行,这由 Executor 实现决定。

②  ExecutorService.submit()

<T> Future<T>
submit(Callable<T> task) 
提交一个返回值的任务用于执行,返回一个表示任务的未决结Future。
 Future<?> submit(Runnable task) 
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
<T> Future<T>
submit(Runnable task, T result) 
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。

两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它定义在Executor接口中,

而submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中

https://www.jianshu.com/p/87bff5cc8d8c

深度剖析Executor框架 ↓↓↓

https://blog.csdn.net/javazejian/article/details/50890554

原文地址:https://www.cnblogs.com/JMrLi/p/11209251.html

时间: 2024-08-14 10:05:05

Java 线程池和多线程编程 ——线程池理解与创建的相关文章

java笔记--使用线程池优化多线程编程

使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库连接池,线程池等. 在java1.5之后,java自带了线程池,在util包下新增了concurrent包,这个包主要作用就是介绍java线程和线程池如何使用的. 在包java.util.concurrent下的 Executors类中定义了Executor.ExecutorService.Sche

使用线程池优化多线程编程

Java中的对象是使用new操作符创建的,如果创建大量短生命周期的对象,这种方式性能非常低下.为了解决这个问题,而发明了池技术. 对于数据库连接有连接池,对于线程则有线程池. 本实例介绍两种方式创建1000个短生命周期的线程,第一种是普通方式,第二种是线程池的方式.通过时间和内存消耗的对比,就可以很明显地看出线程池的优势. 实例结果如下: 说明:使用线程池创建对象的时间是15毫秒,说明线程池是非常高效的. 关键技术: Executors类为java.util.concurrent包中所定义的Ex

多线程编程—线程池的实现

执行与任务分离的组件- 线程池 多线程技术主要解决了处理器单元内多个线程执行的问题,它可以显著的减少处理器单元的闲置时间,增加处理器单元的吞吐能力.线程池是多线程编程的一个必要组件,并且对于很多编程人员都是透明的,更是神秘的.有幸能为大家解析其中缘由,尚有不妥之处,欢迎大家抛砖. 线程池的概念,是一个用来管理一组执行任务线程的工具.既然是管理工具,那么该工具管理是用来管理任务与执行的.如图一线程池组件拓扑图,执行队列(Workers),任务队列(Jobs)和池管理(Pool Manager)三部

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

Linux下简单的多线程编程--线程池的实现

/* 写在前面的话: 今天刚“开原”,选择了一篇关于线程池的文件与大家分享,希望能对您学习有所帮助,也希望能与大家共同学习! 选择在这个特殊的时候注册并发文章也是有一些我个人特殊的意义的,看我的id(西游小学生.45)就知道了,哈哈.在这里也很感谢博客园的员工,刚发申请两分钟就同意了. */ 最近由于要写一个类似于QQ的程序,所以想到要用到多线程.既然要用多线程,那何不写一个线程池?于是上网搜了搜多线程的代码,发现大多都不是很完善,或者有些小bug.所以,在这里贴出一个完整的,经过我多重测试的,

多线程编程——线程同步方法

1.五种方式 1.1 synchronized同步方法 使用synchronized关键字修饰的方法.java每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法.在调用该方法前,需获取内置锁,否则就会处于阻塞状态. 如:public synchronized void save(){} 注:当synchronized关键字修饰静态方法时,会锁住整个类 1.2 synchronized同步代码块 即有synchronized关键字修饰的语句块.被该关键字修饰的语句块会自动被加上内

VC++多线程编程-线程间的通信和线程同步

引用:http://blog.csdn.net/zjc0888/article/details/7372258 线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明. 使用全局变量进行通信 由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量.对于标准类型

多线程编程-----线程同步

同步,永远是多线程编程中最核心和最重要的话题.同步相关的概念比如:临界区,原子操作,以及互斥量等等 总的来说,在多个线程之间采取同步措施,无非是为了让他们更好的协同工作或者维持共享数据的一致性. 1.共享数据的一致性: 多线程程序多以共享数据作为在线程之间传递数据的手段,由于一个进程所拥有的相当一部分虚拟内存地址都可以被该线程中的所有线程所共享.因此这些被共享的数据大多也已内存空间作为载体. 实际上,保证共享数据一致性的最简单且最好的方法,就是使得该数据成为一个常量,但是如果把一个计数器做成常量