博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java线程池应用
阅读量:5235 次
发布时间:2019-06-14

本文共 2638 字,大约阅读时间需要 8 分钟。

1.降低了创建和销毁线程的次数。每一个工作线程都能够被反复利用。可运行多个任务。

2.能够依据系统的承受能力,调整线程池中工作线线程的数目。防止由于消耗过多的内存。而把server累趴下(每一个线程须要大约1MB内存。线程开的越多,消耗的内存也就越大,最后死机)。

Java里面线程池的顶级接口是Executor,可是严格意义上讲Executor并非一个线程池,而仅仅是一个运行线程的工具。真正的线程池接口是ExecutorService。

1. newSingleThreadExecutor

创建一个单线程的线程池。这个线程池仅仅有一个线程在工作,也就是相当于单线程串行运行全部任务。假设这个唯一的线程由于异常结束,那么会有一个新的线程来替代它。此线程池保证全部任务的运行顺序依照任务的提交顺序运行。

2.newFixedThreadPool

创建固定大小的线程池。

每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,假设某个线程由于运行异常而结束。那么线程池会补充一个新线程。

3. newCachedThreadPool

创建一个可缓存的线程池。假设线程池的大小超过了处理任务所须要的线程,

那么就会回收部分空暇(60秒不运行任务)的线程,当任务数添加时,此线程池又可以智能的加入新线程来处理任务。此线程池不会对线程池大小做限制。线程池大小全然依赖于操作系统(或者说JVM)可以创建的最大线程大小。

4.newScheduledThreadPool

创建一个大小无限的线程池。

此线程池支持定时以及周期性运行任务的需求

以下我用2个实例来说明一下 ,线程池的简单有用

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class ThreadPool {     public static void main(String[] args) {    	 //ExecutorService ThreadPool =  Executors.newFixedThreadPool(3);    	 //ExecutorService ThreadPool = Executors.newCachedThreadPool();    	  ExecutorService ThreadPool = Executors.newSingleThreadExecutor();    	 for(int i=0;i<=4;i++){    		 final int task = i;         ThreadPool.execute(new Runnable() {						@Override			public void run() {                for(int j=0;j<=10;j++){                	try {						Thread.sleep(20);					} catch (InterruptedException e) {						e.printStackTrace();					}                	System.out.println(Thread.currentThread().getName() + " is loopping of " + j + " for task of " + task);                }							}		});       }    	 //ThreadPool.shutdownNow();    	 Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() {						@Override			public void run() {				System.out.println("boombing!!");							}		}, 5, 2, TimeUnit.SECONDS);	}}
publicclass TestScheduledThreadPoolExecutor {    publicstaticvoid main(String[] args) {        ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);        exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间就触发异常                      @Override                      publicvoid run() {                           //throw new RuntimeException();                           System.out.println("================");                      }                  }, 1000, 5000, TimeUnit.MILLISECONDS);        exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间打印系统时间。证明两者是互不影响的                      @Override                      publicvoid run() {                           System.out.println(System.nanoTime());                      }                  }, 1000, 2000, TimeUnit.MILLISECONDS);    }}

转载于:https://www.cnblogs.com/zsychanpin/p/6923036.html

你可能感兴趣的文章
POJ1664|DFS水题
查看>>
[php]http的状态码
查看>>
利用Fiddler拦截接口请求并篡改数据
查看>>
python习题:unittest参数化-数据从文件或excel中读取
查看>>
Android控件之GridView探究
查看>>
在工程中要加入新的错误弹出方法
查看>>
在Spark中尽量少使用GroupByKey函数(转)
查看>>
SpingBoot之多Profile文件
查看>>
mongo db 启动停止
查看>>
jQuery克隆DOM节点
查看>>
关于Unity3D中的Debug类的一些函数内容
查看>>
vijos1792:摆花
查看>>
fastestmirror不能使用
查看>>
YIi配置debug工具、yii配置gii工具
查看>>
语言学 —— 中文的构词与规律
查看>>
matlab 警告(warning)、错误(error)、异常(exception)与断言(assert)
查看>>
vs 错误提示及解决方案
查看>>
PS 滤镜— — sparkle 效果
查看>>
Python 异常(Exception)
查看>>
第二遍回顾--①前端flex布局
查看>>