`
heipark
  • 浏览: 2079698 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得

    博客分类:
  • Java
 
阅读更多

newFixedThreadPool使用范例:

 

 

 

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

public class Test {

	public static void main(String[] args) throws IOException, InterruptedException {
		ExecutorService service = Executors.newFixedThreadPool(2);
		for (int i = 0; i < 6; i++) {
			final int index = i;
			System.out.println("task: " + (i+1));
			Runnable run = new Runnable() {
				@Override
				public void run() {
					System.out.println("thread start" + index);
					try {
						Thread.sleep(Long.MAX_VALUE);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("thread end" + index);
				}
			};
			service.execute(run);
		}
	}
}

 

 输出:
task: 1
task: 2
thread start0
task: 3
task: 4
task: 5
task: 6
task: 7
thread start1
task: 8
task: 9
task: 10
task: 11
task: 12
task: 13
task: 14
task: 15

 

    从实例可以看到for循环并没有被固定的线程池阻塞住,也就是说所有的线程task都被提交到了ExecutorService中,查看 Executors.newFixedThreadPool()如下:

 

 

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}

    可以看到task被提交都了LinkedBlockingQueue中。这里有个问题,如果任务列表很大,一定会把内存撑爆,如何解决?看下面:

 

 

import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test {

	public static void main(String[] args) throws IOException, InterruptedException {
		
		BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(3);
		
		ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 1, TimeUnit.HOURS, queue, new ThreadPoolExecutor.CallerRunsPolicy());
		
		for (int i = 0; i < 10; i++) {
			final int index = i;
			System.out.println("task: " + (index+1));
			Runnable run = new Runnable() {
				@Override
				public void run() {
					System.out.println("thread start" + (index+1));
					try {
						Thread.sleep(Long.MAX_VALUE);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("thread end" + (index+1));
				}
			};
			executor.execute(run);
		}
	}
}

 

 输出:
task: 1
task: 2
thread start1
task: 3
task: 4
task: 5
task: 6
task: 7
thread start2
thread start7
thread start6

 

    线程池最大值为4(??这里我不明白为什么是设置值+1,即3+1,而不是3),准备执行的任务队列为3。可以看到for循环先处理4个task,然后把3个放到队列。这样就实现了自动阻塞队列的效果。记得要使用ArrayBlockingQueue这个队列,然后设置容量就OK了。

 

--heipark

 

 

 

 

 

 

 

分享到:
评论
1 楼 liyf_324 2012-11-15  
好帖           

相关推荐

    Executor,Executors,ExecutorService比较.docx

    Executors: 是java.util.concurrent包下的一个类,提供了若干个静态方法,用于生成不同类型的线程池。Executors一共可以创建下面这四类线程池: 1.newFixedThreadPool创建一个可缓存线程池,如果线程池长度超过...

    tcp_thread_java.zip_Java 线程池_java TCP线程

    java简单线程池的实现,使用jdk的Executors.newFixedThreadPool方法来实现固定大小线程池

    C++ library for executors.zip

    C++ library for executors

    Android-Android多线程下载项目

    本项目是一个展示多线程下载的项目,使用线程池(Executors.newFixedThreadPool(2))对线程的管理,支持断点续传,第一个版本默认可以两个线程同时下载。

    两种线程池写法

    ThreadPoolManager:Executors.newFixedThreadPool(num * 2);// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程 threadPool: 线程池 创建线程池,销毁线程池,添加新任务

    java 线程Sample

    ExecutorService exec=Executors.newFixedThreadPool(2); Thread1 th1 = new Thread1("CRTA"); th1.setDaemon(true); th1.setPriority(MIN_PRIORITY); th1.start(); Thread1 th2 = new Thread1("CRTB");

    rxlib:一组用于Java的实用程序

    // Executors.newFixedThreadPool(16); 执行的thread数量固定,但当thread 等待时间(IO时间)过长时会造成吞吐量下降。当thread 执行时间过长时无界的LinkedBlockingQueue可能会OOM。 // new ThreadPoolExecutor...

    面试官这样问Java 线程池,我的回答让他竖起了大拇指!

    前言 这周我投递出了简历,岗位是java后端开发工程师。这周美团面试官给我进行了面试。面试过程中他问了线程池...Executors.newFixedThreadPool(100);//创建固定大小的线程池 Executors.newSingleThreadExecutor();//创

    Java进阶之ThreadPoolExecutor

     · 使用Executors.newFixedThreadPool(int)  · 使用Executors.newSingleThreadExecutor()  其中使用2,3,4来创建线程池时,其内部也是通过ThreadPoolExecutor来生成线程池的。我们来分析下...

    report-batch-renderer:用于批量渲染包括PDF和Excel的报告的实用程序

    ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());项目中支持将本地路径中的html文件批量转换为PDF,放入本地文件系统中。使用说明List htmlsPaths = ...

    Android图片上传下载小框架

    private static ExecutorService threadPool = Executors.newFixedThreadPool(LOADING_THREADS); private SmartImageTask currentTask; public SmartImageView(Context context) { super(context); } ...

    java 线程池管理类:Executors_.docx

    java 线程池管理类:Executors_.docx

    Java开发手册(阿里巴巴带-alibaba-IDE插件)

    《阿里巴巴Java开发手册》是阿里内部Java工程师所遵循的开发规范,涵盖编程规约、单元测试规约、异常日志规约、MySQL规约、工程规约、安全规约等,这是近万名阿里Java技术精英的经验总结,并经历了多次大规模一线...

    CacheImage:使用 RAM 和 SD 卡缓存来显示一些资源以提高性能和离线功能

    README 使用Executors.newFixedThreadPool(5/poolSize/) 固定了5个线程来执行异步操作, 但是由于网络费时,会出现性能瓶颈,掉帧等情况。 并且 listview 会有图片错乱的问题。

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

    ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(5); 和创建单一线程池类似, 不同的是线程池中有多个线程, 可以并行处理任务, 若多个线程任务被提交到此线程池, 会有以下执行过程: 如果...

    银行业务调度系统

    Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() { public void run() { Integer number = NumberMachine.getInstance().getCommonManager().generateNewManager(); System.out....

    Java线程并发控制基础知识

    线程池  推荐用ThreadPoolExecutor的工厂构造类Executors来管理线程池,线程复用线程池开销较每次申请新线程小,具体看代码以及注释 ... * 建议使用Executors.newFixedThreadPool(n) *

    thread count

    ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT); for(Player p:plays) exe.execute(p); //分配线程 System.out.println("Race begins!"); begin.countDown(); try{ end.wait(); //等待...

    java socket线程池

     //Runtime的availableProcessors()方法返回当前系统的CPU的数目 //系统的CPU越多,线程池中工作线程的数目也越多 executorService= Executors.newFixedThreadPool(   Runtime.getRuntime()....

    Executors 使用实例

    java Executors 使用实例 concurrent.ExecutorService

Global site tag (gtag.js) - Google Analytics