Java线程(二)线程池

原创 2016年08月31日 10:16:35
系统启动一个新线程成本很高,使用线程池能很好的提高性能。尤其当需要创建大量的生存周期很短的线程时,更应该考虑线程池。
线程池在系统启动时会创建大量空闲的线程,将一个Runnable对象或者Callable对象传给线程池,线程池就会启动一个线程来执行run()或者call()方法,执行结束后线程不会死亡,再次返回线程池成为空闲状态,等待执行下一个run()或者call()方法。
创建线程池执行线程的方法:
1.调用Executors类的静态工场方法创建ExecutorService对象,该对象代表一个线程
2.创建Runnable实现类或Callable实现类的实例,作为线程执行任务
3.调用ExecutorService对象的submit()方法提交实例
4.不想提交时,调用ExecutorService对象的shutdown()关闭线程池
public class OneThreadPool{
	 public static void main(String[] args){
	 	ExecutorService pool = Executors.newFixedThreadPool(6);	//创建线程池
	 	//使用Lambda表达式创建Runnable对象
	 	Runnable target = ()->{
	 		//执行代码
	 	};
	 	pool.submit(target);	//提交线程
	 	pool.shutdown();	//关闭线程池
	}
}

ForkJoinPool是一种特殊的线程池,支持把一个任务拆成多个小任务并行计算,再把多个小任务结果合并,是ExecutorService实现类。
ForkJoinPool commentPool():返回一个通用池,通用池状态不受shutdown()或者shutdownNow()影响
getCommentPoolParallelism()返回通用池并行级数
创建了ForkJoinPool 的实例后,调用submit(ForkJoinTask task)或者invoke(ForkJoinTask task)方法执行指定任务,ForkJoinTask代表可并行合并任务。
ForkJoinTask是一个抽象类,有两个抽象子类RecursiveAction和RecuersiveTask,RecuersiveTask代表有返回值的任务,RecursiveAction代表没有返回值的任务
下面是一个例子,使用RecuersiveTask对长度是100的数组元素值累加
class PoolTask extends RecuersiveTask<Integer>{
	private static final int num = 20;	//每个小任务最多累加20个
	private int arr[];
	private int start;
	private int end;


	public PoolTask(int arr[],int stat,int end){
		this.arr = arr;
		this.start = start;
		this.end = end;
	}


	protected Integer compute(){
		int sum = 0;
		if(end-start < num){
			for(int i = start;i < end;i++)
				sum += arr[i];
			return sum;
		}else{
			int middle = (start + end)/2;
			//将大人物分解为两个小任务
			PoolTask left = new PoolTask(arr,start,middle);
			PoolTask right = new PoolTask(arr,middle,end);
			//并行执行两个小任务
			left.fork();
			right.fork();
			//两个小任务结果合并起来
			return left.join() + right.join();
		}
	}
}
public class ForkJoinPoolTest{
	public static void main(String[] args) throws Exception{
		int[] arr = new int[100];
		Random random = new Random;
		int total = 0;
		//初始化100个元素
		for(int i = 0,len = arr.lenght;i < len;i++){
			int tmp = random.nextInt(20);
			total += (arr[i] = tmp);
		}


		ForkJoinPool pool = ForkJoinPool.commonPool();	//创建一个通用池
		Future<Integer> future = pool.submit(new PoolTask(arr,0,arr.lenght));	//提交一个可分解的PoolTask任务
		pool.shutdown();	//关闭
	}
}


ForkJoinPool使用步骤:1.创建ForkJoinPool实例pool->2.Future.submit(Task)->3.pool.shutdown()
在ForkJoinTask中实现任务的分解和合并,分别用到了fork()和join()
RecursiveAction的用法和RecursiveTask用法大致相同,只是没有返回值
版权声明:本文为博主原创文章,未经博主允许不得转载。

两个带有线程池的方法分别执行两组线程任务,第二个方法需要等待第一组任务执行完毕

如下两种解决方案其中一个会影响效率,另一个可能会有未知风险,如果谁有更好的解决方案,谢谢分享。 package thread; import java.util.ArrayList; im...
  • zhaoqingkaitt
  • zhaoqingkaitt
  • 2016年08月17日 09:47
  • 1301

Java Web应用调优线程池:没你想的那么复杂

不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求。线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的。本文由浅入深,介绍了Java线程池的使用,以及正确配...
  • chengzhezhijian
  • chengzhezhijian
  • 2016年02月17日 14:29
  • 3395

java中的进程,线程,线程池总结

1、线程与进程进程狭义上讲:正在执行的程序,由线程组成,可包含多个线程在运行。 广义上讲:进程是一个具有一定独立功能的程序有关于某个数据集合的一次运行的活动。它可以申请或者拥有系统资源,是一个动态...
  • androidxiaogang
  • androidxiaogang
  • 2015年11月06日 14:45
  • 3250

java线程、线程池、xml解析入门

  • 2012年08月17日 12:08
  • 2.3MB
  • 下载

JAVA线程、线程池资料----下载不扣分,回帖加1分,欢迎下载,童叟无欺

  • 2010年01月23日 10:52
  • 28KB
  • 下载

Java并发(二)——线程相关类与线程池

第六部分 线程相关类6.1 继承关系Executor接口-
  • u010255818
  • u010255818
  • 2017年04月24日 00:36
  • 247

java线程池(newFixedThreadPool)线程消失疑问?

使用executorService提交(submit)线程任务时,若任务执行过程中抛出未被捕获的RuntimeException或error时,会造成这条线程终止吗? 比如若原来线程池中有五条线程,抛...
  • AlbertFly
  • AlbertFly
  • 2017年08月07日 18:27
  • 495

java线程(5)——线程池(上)

线程池是一种多线程的处理形式,处理过程中将任务添加到队列,然后创建线程后自动启动这些任务。线程池的种类有很多,我们可以根据具体业务需要决定是否使用、使用哪种线程池。...
  • u010066934
  • u010066934
  • 2016年04月15日 16:17
  • 548

java并发包:线程复用之线程池

本文转载至:http://blog.csdn.net/a910626/article/details/51900966 什么是线程池 频繁使用new Thread来创建线程的方式并不太好。因为...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2017年04月20日 21:33
  • 381

Java线程(六):线程池

自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、St...
  • z69183787
  • z69183787
  • 2014年06月05日 16:55
  • 554
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java线程(二)线程池
举报原因:
原因补充:

(最多只允许输入30个字)