线程池

Java多线程之线程池

让人想犯罪 __ 提交于 2020-03-23 15:56:25
//创建并返回一个线程池 ExecutorService es = Executors.newSingleThreadExecutor(); //此线程池只能容纳一个线程。放入的线程会依次执行,上一个执行完毕,才会执行下一个。 // ExecutorService es = Executors.newFixedThreadPool(10); //指定能容纳的最大线程数,达到最大数后无法扩容。这个用得最多 // ExecutorService es = Executors.newScheduledThreadPool(10); //指定线程池的初始大小,达到初始值后可以继续放入线程,会自动扩容,最大线程数受限于JVM的资源 // ExecutorService es = Executors.newCachedThreadPool(); //最大线程数受限于jvm的资源,如果一个线程空闲多少秒(默认60s),会自动回收该线程 //线程要自己放进去 es.execute(new Thread1()); //往线程池中放入一条线程,并开始执行此线程 es.execute(new Thread2()); //可以是extends Thread的类,也可以是实现Runnable接口的类 //es.submit(new Thread2()); //submit()和execute()作用差不多

ICE异步程序设计-----AMI/AMD

梦想的初衷 提交于 2020-03-23 15:38:19
1 简介 AMI 异步方法调用(AMI) 这个术语描述的是客户端的异步编程模型支持。 如果你使用AMI 发出远地调用,在Ice run time 等待答复的同时,发出调用的线程不会阻塞。相反,发出调用的线程可以继续进行各种活动,当答复最终到达时, Ice run time 会通知应用。通知是通过回调发给应用提供的编程语言对象的 AMD 一个服务器在同一时刻所能支持的同步请求数受到Ice run time 的服务器线程池的尺寸限制(参见15.3 节)。如果所有线程都在忙于分派长时间运行的操作,那么就没有线程可用于处理新的请求,客户就会经验到不可接受的无响应状态。异步方法分派(AMD) 是AMI 的服务器端等价物 ,能够解决这个可伸缩性问题 。 在使用AMD 时,服务器可以接收一个请求,然后挂起其处理,以尽快释放分派线程。当处理恢复、结果已得出时,服务器要使用Ice runtime 提供的回调对象,显式地发送响应。 使用AMD时,客户端如果需要等待返回值,那就一直等待,否则就继续往下执行。 为什么使用AMD? 用实际的术语说, AMD 操作通常会把请求数据(也就是,回调对象和操作参数)放入队列 ,供应用的某个线程(或线程池)随后处理用。这样,服务器就使分派线程的使用率降到了最低限度,能够高效地支持数千并发客户。 另外, AMD 还可用于需要在完成了客户的请求之后继续进行处理的操作

线程池

江枫思渺然 提交于 2020-03-23 15:35:08
线程池 [TOC] 线程池概述 什么是线程池 为什么使用线程池 线程池的优势 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。 创建一个线程池并提交线程任务 线程池源码解析 参数认识 corePoolSize : 线程池的基本大小,当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。 runnableTaskQueue:任务对列,用于保存等待执行的任务的阻塞队列。可以选择以下几个阻塞队列。 ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。 LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue

线程池python

跟風遠走 提交于 2020-03-23 00:46:45
为什么需要线程池   目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。   传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就是是“ 即时创建, 即时销毁 ”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是 如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态 。   我们将传统方案中的线程执行过程分为三个过程:T1、T2、T3:   T1:线程创建时间   T2:线程执行时间,包括线程的同步等时间   T3:线程销毁时间   那么我们可以看出,线程本身的开销所占的比例为(T1+T3) / (T1+T2+T3)。如果线程执行的时间很短的话,这比开销可能占到20%-50%左右。如果任务执行时间很频繁的话,这笔开销将是不可忽略的。   除此之外,线程池能够减少创建的线程个数。通常线程池所允许的并发线程是有上界的,如果同时需要并发的线程数超过上界,那么一部分线程将会等待。而传统方案中,如果同时请求数目为2000,那么最坏情况下,系统可能需要产生2000个线程。 尽管这不是一个很大的数目,但是也有部分机器可能达不到这种要求。   

java的线程池

廉价感情. 提交于 2020-03-22 18:31:11
java的线程池 由于线程和数据库连接这些资源都是非常宝贵的的资源,每次需要的时候创建,不需要的时候销毁,是非常消耗资源的。为在java在java.util.concurrent包下为我们提供了线程池供我们使用。 java线程池的顶级接口是Executor,如下实现图 常采用Executors来创建线程池,其中最常用如下: public class Executors { /** * 创建一个根据需要创建新线程的线程池,当调用execute将重用以前构造出来的线程, * 如果现有的线程没有可用的,将会重新创建新的线程,并添加到线程池中, *如果线程在60s没有被使用,将会从线程池中移除。如果长时间保持空闲,该线程池不会占用任何资源 * * @return the newly created thread pool */ public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } /** * 创建固定数量线程的线程池,如果线程池中没有足够的数量的线程来执行任务, * 则任务将会在队列中等待,直到有线程来执行它

为什么不建议使用Executors创建线程池

為{幸葍}努か 提交于 2020-03-22 17:35:28
3 月,跳不动了?>>> 可以通过Executors静态工厂构建线程池,但一般不建议这样使用 因为这种创建线程池的方式有很大的隐患,稍有不慎就有可能导致线上故障。 Executors Executors 是一个Java中的工具类。提供工厂方法来创建不同类型的线程池。 Executors的创建线程池的方法,创建出来的线程池都实现了ExecutorService接口。 常用方法有以下几个: newFiexedThreadPool(int Threads):创建固定数目线程的线程池。 newCachedThreadPool():创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。 newSingleThreadExecutor()创建一个单线程化的Executor。 newScheduledThreadPool(int corePoolSize)创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。 Executors的功能还是比较强大的,又用到了工厂模式、又有比较强的扩展性,重要的是用起来还比较方便,如: ExecutorService executor = Executors.newFixedThreadPool

JAVA多线程实现的三种方式

我的未来我决定 提交于 2020-03-22 15:01:28
Java 多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如: public class MyThread extends Thread {    public void run() {    System.out.println( "MyThread.run()");   } } public class MyThread extends Thread {   public void run() {    System.out.println("MyThread.run()");   } } 在合适的地方启动线程如下: MyThread

Python之线程池

与世无争的帅哥 提交于 2020-03-20 23:17:08
版本一: #!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading class ThreadPool(object): def __init__(self, max_num=20): self.queue = Queue.Queue(max_num) for i in xrange(max_num): self.queue.put(threading.Thread) def get_thread(self): return self.queue.get() def add_thread(self): self.queue.put(threading.Thread) """ pool = ThreadPool(10) def func(arg, p): print arg import time time.sleep(2) p.add_thread() for i in xrange(30): thread = pool.get_thread() t = thread(target=func, args=(i, pool)) t.start() """ 版本二: #!/usr/bin/env python # -*- coding:utf-8 -*- """ custom ThreadPool

对线程池简单理解

爷,独闯天下 提交于 2020-03-20 03:04:03
线程池的好处: 1,因为线程是比较昂贵的资源,避免大量重复创建销毁线程,使用者不用关心创建销毁线程。 2,用户提交的任务能够及时的得到处理,提高响应速度。 3,能够更好的监控和管理线程。 ThreadPoolExecutor参数 int corePoolSize 线程池基本大小 int maximumPoolSize 线程池最大大小 long keepAliveTime 保持活动时间 TimeUnit unit 保持活动时间单位 BlockingQueue workQueue 工作队列 ThreadFactory threadFactory 线程工厂 RejectedExecutionHandler handler 驳回回调 这些参数这样描述起来很空洞,下面结合执行任务的流程来看一下。 ThreadPoolExecutor执行任务流程 当线程池大小 >= corePoolSize 且 队列未满时,这时线程池使用者与线程池之间构成了一个生产者-消费者模型。线程池使用者生产任务,线程池消费任务,任务存储在BlockingQueue中,注意这里入队使用的是offer,当队列满的时候,直接返回false,而不会等待。 keepAliveTime 当线程处于空闲状态时,线程池需要对它们进行回收,避免浪费资源。但空闲多长时间回收呢,keepAliveTime就是用来设置这个时间的。默认情况下

Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

ε祈祈猫儿з 提交于 2020-03-20 03:03:32
认识cpu、核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 java多线程系列(五)之synchronized ReentrantLock volatile Atomic 原理分析 java多线程系列(六)之线程池原理及其使用 _____________________________________________________________________________ ExecutorService——newScheduledThreadPool使用功能测试 https://blog.csdn.net/wo541075754/article/details/51556198 测试目的 学习ScheduledExecutorService类创建的newScheduledThreadPool相关用法 具体事例 创建newScheduledThreadPool及scheduleAtFixedRate和scheduleWithFixedDelay方法的使用。 package com.secbro.test.thread; import java.text.DateFormat; import java.util.Date;