线程池

JDK5多线程框架java.util.concurrent

六月ゝ 毕业季﹏ 提交于 2020-03-02 11:01:40
JDK5中的一个亮点就是将Doug Lea的并发库引入到Java标准库中。Doug Lea确实是一个牛人,能教书,能出书,能编码,不过这在国外还是比较普遍的,而国内的教授们就相差太远了。 一般的服务器都需要线程池,比如Web、FTP等服务器,不过它们一般都自己实现了线程池,比如以前介绍过的Tomcat、Resin和Jetty等,现在有了JDK5,我们就没有必要重复造车轮了,直接使用就可以,何况使用也很方便,性能也非常高。 Java代码 package concurrent; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestThreadPool { public static void main(String args[]) throws InterruptedException { // only two threads ExecutorService exec = Executors.newFixedThreadPool( 2 ); for ( int index = 0 ; index < 100 ; index++) { Runnable run = new Runnable() { public void run() {

Java自学-多线程 线程池

眉间皱痕 提交于 2020-03-02 10:25:07
Java 如何开发一个自定义线程池 每一个线程的启动和结束都是比较消耗时间和占用资源的。 如果在系统中用到了很多的线程,大量的启动和结束动作会导致系统的性能变卡,响应变慢。 为了解决这个问题,引入线程池这种设计思想。 线程池的模式很像 生产者消费者模式 ,消费的对象是一个一个的能够运行的 任务 步骤 1 : 线程池设计思路 线程池的思路和生产者消费者模型是很接近的。 准备一个任务容器 一次性启动10个 消费者线程 刚开始任务容器是空的,所以线程都 wait 在上面。 直到一个外部线程往这个任务容器中扔了一个“任务”,就会有一个消费者线程被唤醒notify 这个消费者线程取出“任务”,并且 执行这个任务 ,执行完毕后,继续等待下一次任务的到来。 如果短时间内,有较多的任务加入,那么就会有多个线程被 唤醒 ,去执行这些任务。 在整个过程中,都不需要创建新的线程,而是 循环使用这些已经存在的线程 步骤 2 : 开发一个自定义线程池 这是一个自定义的线程池,虽然不够完善和健壮,但是已经足以说明线程池的工作原理 缓慢的给这个线程池添加任务,会看到有多条线程来执行这些任务。 线程7执行完毕任务后, 又回到池子里 ,下一次任务来的时候,线程7又来执行新的任务。 package multiplethread; import java.util.LinkedList; public class

(java并发)ScheduledThreadPoolExcutor

*爱你&永不变心* 提交于 2020-03-02 04:33:01
1.用timer缺点非常大 Timer 的优点在于简单易用,但由于 所有任务都是由同一个线程来调度 , 因此所有任务都是串行执行的,同一时间只能有一个任务在执行 , 前一个任务的延迟或异常都将会影响到之后的任务。 我们关于定时/周期操作都是通过Timer来实现的。但是Timer有以下几种危险 a. Timer是基于绝对时间的。容易受系统时钟的影响。 b. Timer只新建了一个线程来执行所有的TimeTask。所有TimeTask可能会相关影响 c. Timer不会捕获TimerTask的异常,只是简单地停止。这样势必会影响其他TimeTask的执行。 2.ScheduledThreadPoolExecutor 鉴于 Timer 的上述缺陷, Java 5 推出了基于线程池设计的ScheduledThreadPoolExecutor。其设计思想是, 每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰 。需 要注意的是,只有当任务的执行时间到来时,ScheduedExecutor 才会真正启动一个线程,其余时间 ScheduledExecutor 都是在轮询任务的状态。 有以下四个调度器的方法: public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit

Executors浅析

依然范特西╮ 提交于 2020-03-02 02:59:51
#简述 Executors是一个工厂类,是ExecutorService的实用方法。他能够产生ExecutorService、ScheduledExecutorService、ThreadFactory和Callable实例。 #方法介绍 public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } 创建一个线程数固定的可复用线程池。该线程池包含一个无界共享队列。线程池中有固定的活跃线城处理任务,如果多余的任务进入则放置到无界共享队列中去等待有线程空余。如果有任何一个线程在线程池关闭之前执行任务的过程中失败而被终止,则新的线程将要代替它执行子任务。线程池里面的线程在线程池被关闭之前一直存活。 public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads, 0L,

EXECUTORSERVICE线程池讲解

折月煮酒 提交于 2020-03-02 02:40:56
ExecutorService 建立多线程的步骤: 1。定义线程类 class Handler implements Runnable{ } 2。建立ExecutorService线程池 ExecutorService executorService = Executors.newCachedThreadPool(); 或者 int cpuNums = Runtime.getRuntime().availableProcessors(); //获取当前系统的CPU 数目 ExecutorService executorService =Executors.newFixedThreadPool(cpuNums * POOL_SIZE); //ExecutorService通常根据系统资源情况灵活定义线程池大小 3。调用线程池操作 循环操作,成为daemon,把新实例放入Executor池中 while(true){ executorService.execute(new Handler( socket )); // class Handler implements Runnable{ 或者 executorService.execute(createTask(i)); //private static Runnable createTask(final int taskID) }

线程池的学习

蹲街弑〆低调 提交于 2020-03-02 02:39:01
以下为个人的学习和总结,如果只是为了了解线程池,可以谷歌到大量优秀的文章.这里只是为了记录我的学习思路,参考的其他人的博客 . ,有些归纳不正确之处望斧正 我会不断归纳总结新看到的文章来丰富细节 为什么我们要用线程池 除了用线程池代码看起来比较高大上这个理由外,先说说用线程池和不用线程池相比都有什么好处吧 我就用大白话解释了,总比复制粘贴死记硬背好些吧...... 降低资源消耗 创建和销毁线程是有成本消耗的.线程池正是为了解决线程生命周期开销问题和资源不足问题 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 这就像一次性筷子和食堂用的消毒筷子一样,没必要每个人吃完饭就把筷子销毁重新做(虽然实际上这样相对比较卫生......吧?) 提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行。 还是拿筷子解释吧(和食堂筷子卯上了),线程池就像装筷子的消毒柜,用时直接拿,用完再放回去.没必要来个人吃饭(执行任务)就说:我们在给你准备一双新筷子(创建新线程),你先等一下...... 提高线程的可管理性 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。 消毒柜里统一发放用完后洗过(回收)的筷子(线程),而不是来个人就弄一双筷子,到最后筷子扔的到处都是

ExecutorService线程池讲解

牧云@^-^@ 提交于 2020-03-02 01:46:39
ExecutorService 建立多线程的步骤: 1。定义线程类 class Handler implements Runnable{ } 2。建立ExecutorService线程池 ExecutorService executorService = Executors.newCachedThreadPool(); 或者 int cpuNums = Runtime.getRuntime().availableProcessors(); //获取当前系统的CPU 数目 ExecutorService executorService =Executors.newFixedThreadPool(cpuNums * POOL_SIZE); //ExecutorService通常根据系统资源情况灵活定义线程池大小 3。调用线程池操作 循环操作,成为daemon,把新实例放入Executor池中 while(true){ executorService.execute(new Handler(socket)); // class Handler implements Runnable{ 或者 executorService.execute(createTask(i)); //private static Runnable createTask(final int taskID) }

线程池学习

微笑、不失礼 提交于 2020-03-02 01:26:26
 新建一个线程并启动,开销会很大,因为运行线程需要的资源比调用对象方法需要的资源多得多。在很多情况下,线程被用于执行一类任务,而这类任务数量很多,发生的时间分布不均,如果为每个新任务都启用一个新线程来执行,则开销会太大,可以采用一种性能优化技术,就是使用线程池。   将若干执行任务的线程放在池中,当有任务要执行时,从池中取出一个空闲线程来处理任务,处理完任务后,再讲线程对象放入池中。线程池实际上就是一个对象池,只是池中的对象都是线程。   本文实例将实现一个线程池,可以给线程池分配任务,线程池中的线程自动获取任务并执行。   关键技术:1.线程组ThreadGroup可以管理多个线程,所以让线程池继承ThreadGroup。        2.无条件关闭线程池时,通过ThreadGroup的interrupt方法中断池中的所有线程。        3.有条件关闭线程池时,通过ThreadGroup获得池中所有活动线程的引用,依次调用Thread的join方法等待活动线程执行完毕。当所有线程都运行结束时,线程池才 能被关闭。        4.将任务放在LinkedList中,由于LinkedList不支持同步,所以在添加任务和获取任务的方法声明中必须使用Synchronized关键字。 实例 package book.thread.pool; /** *定义任务的接口类 */

实现线程的方式到底有几种?

拈花ヽ惹草 提交于 2020-03-01 18:42:28
这篇文章主要讲解实现线程的方式到底有几种?以及实现 Runnable 接口究竟比继承 Thread 类实现线程好在哪里? 实现线程是并发编程中基础中的基础,因为我们必须要先实现多线程,才可以继续后续的一系列操作。所以本文就先从并发编程的基础如何实现线程开始讲起。 实现线程的方式到底有几种?我们接下来看看它们具体指什么? 实现 Runnable 接口 public class RunnableThread implements Runnable { @Override public void run () { System.out.println( "实现Runnable接口实现线程" ); } } 第 1 种方式是通过实现 Runnable 接口实现多线程,如代码所示,首先通过 RunnableThread 类实现 Runnable 接口,然后重写 run() 方法,之后只需要把这个实现了 run() 方法的实例传到 Thread 类中就可以实现多线程。 继承 Thread 类 public class ExtendsThread extends Thread { @Override public void run () { System.out.println(“继承Thread类实现线程 "); } } 第 2 种方式是继承 Thread 类,如代码所示,与第 1

多线程进阶——JUC并发编程之Executors框架设计思想一探究竟🔥

浪子不回头ぞ 提交于 2020-03-01 16:55:31
1、学习切入点 Executors 框架是整个JUC 包中类/接口关系中最为复杂的框架,真正理解Executors框架的前提是理清楚各个模块之间的关系,高屋建瓴, 从整体到局部 才能透彻理解各个模块的功能和背后设计的思路! 本文将从 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory和Callable 这些核心模块展开分析。 2、从Executor谈起 Executor 是JDK 1.5 时,随着JUC引入的一个接口,引入该接口的主要目的是 解耦任务本身和任务执行。我们之前通过线程执行一个任务时,往往需要先创建一个线程.satrt()去执行任务, 而Executor 接口解耦了任务和任务的执行,该接口只有一个方法,入参为待执行的任务。 public interface Executor { /** * 执行给定的Runable任务 * 根据Executor接口的实现类不同,具体执行方式也不同 */ void execute(Runnable command); } 我们可以像下面这样执行任务,而不必心线程的创建 Executor executor = anExecutor executor.execute(new RunnableTask1()); executor.execute(new