`

Java多线程之ThreadPoolExecutor

    博客分类:
  • java
阅读更多

1.ExecutorService demo

 

package com.ccy.thread.demo;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 
 * <p> 
 * Title: ThreadPoolTest.java 
 * Package com.ccy.thread.demo 
 * </p>
 * <p>
 * Description: 线程池简单demo
 * <p>
 * @author Tom.Cai
 * @created 2015-12-30 下午10:45:14 
 * @version V1.0 
 *
 */
public class ThreadPoolTest {
	public static void main(String[] args) {
		//创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
		ExecutorService threadPool = Executors.newFixedThreadPool(3);
		for (int i = 0; i < 6; i++) {
            Runnable worker = new workThread(String.valueOf(i));
            threadPool.execute(worker);
          }
		//启动一次顺序关闭,执行以前提交的任务,但不接受新任务。
		threadPool.shutdown();
		//  如果关闭后所有任务都已完成,则返回 true。
        while (!threadPool.isTerminated()) {
        	
        }
        System.out.println("all threads Finished");
	}
}


class workThread implements Runnable{
	private String command;
	
	
	
	public workThread(String command){
		this.command = command;
	}
	
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+" Start time-"+command);
		try {
			Thread.sleep(5000);
		} catch (Exception e) {
			e.printStackTrace();
		}
        System.out.println(Thread.currentThread().getName()+" End !!!");
	}
	
}

2.ThreadPoolExecutor demo

package com.ccy.thread.demo;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
 * 
 * <p> 
 * Title: ThreadPoolExecutorTest.java 
 * Package com.ccy.thread.demo 
 * </p>
 * <p>
 * Description: 线程池监控demo
 * <p>
 * @author Tom.Cai
 * @created 2015-12-30 下午10:48:21 
 * @version V1.0 
 *
 */
public class ThreadPoolExecutorTest {
	public static void main(String[] args) throws Exception {
		RejectedExecutionHandlerImpl rejectionHandler = new RejectedExecutionHandlerImpl();
		ThreadFactory threadFactory = Executors.defaultThreadFactory();
		//在初始化 ThreadPoolExecutor 时,初始线程池大小设为2、最大值设为4、线程工作等待队列大小设为2。
		//所以,如果当前有4个任务正在运行而此时又有新任务提交,工作队列将只存储2个任务和其他任务将交由RejectedExecutionHandlerImpl 处理。
		ThreadPoolExecutor executorPool = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2), threadFactory, rejectionHandler);
		MonitorThread monitor = new MonitorThread(executorPool);
        Thread monitorThread = new Thread(monitor);
        monitorThread.start();
        for(int i=0; i<10; i++){
            executorPool.execute(new workerThread(String.valueOf(i)));
        }
        Thread.sleep(30000);
        executorPool.shutdown();
        Thread.sleep(5000);
        monitor.shutdown();
	}
}

class RejectedExecutionHandlerImpl implements RejectedExecutionHandler {

	@Override
	public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
			System.out.println(r.toString() + " is rejected");
	}

}

class MonitorThread implements Runnable{
	private ThreadPoolExecutor executor;
	private boolean runFlag = true;
	
	public MonitorThread(ThreadPoolExecutor executor){
		this.executor = executor;
	}
	
	public void shutdown(){
        this.runFlag = false;
    }
 
	@Override
	public void run() {
		 while(runFlag){
             System.out.println(
                 String.format("[monitor] [%d/%d] Active: %d, Completed: %d, Task: %d, isShutdown: %s, isTerminated: %s",
                	 // 返回池中的当前线程数。
                     this.executor.getPoolSize(),
                     // 返回核心线程数。
                     this.executor.getCorePoolSize(),
                     this.executor.getActiveCount(),
                     this.executor.getCompletedTaskCount(),
                     //返回曾计划执行的近似任务总数。
                     this.executor.getTaskCount(),
                     this.executor.isShutdown(),
                     this.executor.isTerminated()));
             try {
                 Thread.sleep(3000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
     }
	}
	
}

class workerThread implements Runnable{
	private String command;
	
	public workerThread(String command){
		this.command = command;
	}
	
	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName()+" Start time-"+command);
		try {
			Thread.sleep(5000);
		} catch (Exception e) {
			e.printStackTrace();
		}
        System.out.println(Thread.currentThread().getName()+" End !!!");
	}
	
}


 

更多多线程精彩内容请继续关注我的博客http://blog.csdn.net/caicongyang

记录与分享,你我共成长 -fromcaicongyang
 
 



 

分享到:
评论

相关推荐

    Java多线程Executors批量执行数据实现限流

    Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...

    ThreadPoolExecutor:使用多线程ThreadPoolExecutor从Web加载图像

    线程池执行器 使用多线程ThreadPoolExecutor从Web加载图像

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    第7章-JUC多线程v1.1.pdf

    JAVA线程基本学习, JAVA多线程的特性= 线程池: 本质上是一个对象池, 用来管理线程资源. 在任务执行前, 需要从线程池中拿出线程来执行. 在任务执行完成之后, 需要把线程放回线程池. 线程池好处: 降低资源的消耗...

    Java中的线程与线程池.pptx

    本文档对Java中的线程和线程池进行了简单介绍。首先,阐述了为什么需要线程、Java中实现线程的几种方式,线程的多种状态切换;然后,介绍了为什么需要线程池,JDK自带的线程池实现方式ThreadPoolExecutor的使用及其...

    迅雷笔试题java-concurrent_download:Java多线程并发下载器,支持断点下载(手写不限速的迷你版迅雷)

    Java并发编程:03-多线程并发下载器, 支持断点下载(手写不限速的迷你版迅雷) 主要是最近学习完一些初级的并发知识, 所以想使用这些知识做一个小小工具, 巩固一下知识点, 然后就想到了多线程并发下载文件的这个小工具...

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip 涉及到的技术点 - 线程池ThreadPoolExecutor - 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ...

    Java NIO+多线程实现聊天室

    线程池ThreadPoolExecutor 阻塞队列BlockingQueue,生产者消费者模式 选择器 渠道 字节缓冲区 ProtoStuff 高性能序列化 HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子指标 内置锁 竣工服务 log4j+slf4j...

    ThreadPoolExecutor线程池

    ThreadPoolExecutor线程池

    Java 7并发编程实战手册

    如果你是一名Java开发人员,并且想进一步掌握并发编程和多线程技术,并挖掘Java 7并发的新特性,那么本书是你的合适之选。 《Java 7并发编程实战手册》 第1章 线程管理 1 1.1 简介 1 1.2 线程的创建和运行...

    java8源码-concurrency:java并发总结

    并发多线程从简到全 参考: 目录: [TOC] 相关文档: kwseeker/netty Executors线程池.md 1 基本概念 1.1 CPU与线程的关系 1.2 线程与进程的区别和关系 1.3 吞吐量 1.4 线程安全 1.5 线程声明周期 1.6 守护线程 1.7 ...

    java编发编程:JUC综合讲解

    JUC(java.util.concurrent)库是 Java 标准库的一部分,提供了丰富的多线程并发工具,旨在帮助开发者编写高性能、高可伸缩性的并发程序。下面综合介绍 JUC 库的几个核心概念以及它们在并发编程中的重要性。 1. ...

    Chat:Java NIO+多线程实现聊天室

    Java基于多线程和NIO实现聊天室涉及到的技术点线程池ThreadPoolExecutor阻塞队列BlockingQueue,生产者消费者模式SelectorChannelByteBufferProtoStuff 高性能序列化HttpClient连接池Spring依赖注入lombok简化POJO...

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    11-线程池ThreadPoolExecutor底层原理源码分析(上)-周瑜.pdf

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    12-线程池ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf

    11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、...

    zxing.java源码解析-StudyRoad:Java&Android开发知识点备忘

    多线程 Thread AsyncTask IntentService HandlerThread ThreadPoolExecutor ​ 多进程 Socket ​ 网络编程 WebView 数据存储技术 ​ 多媒体 音频 视频 摄像头 位置与传感器 位置服务 其它传感器 硬件连接 蓝牙 NFC ...

    java对大数据的处理.pdf

    } } 数据处理:这⾥的思路也是将数据⼩化然后处理,这⾥使⽤了多线程,设定单个线程处理量,然后开启多个线程处理,这⾥需要考虑你的服 务器的承载能⼒,如果线程开得太多了,处理不过来,会出现蹦死的情况。...

    Java并发编程实战

    本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则...

    Java线程池框架核心代码分析

     多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的。线程池应运而生,成为我们管理线程的利器。Java 通过Executor接口,提供了一种标准的方法将任务的提交过程和执行过程解耦...

Global site tag (gtag.js) - Google Analytics