java线程池的创建使用
利用java的多线程编程可以大大的提高系统的并发运行效率,线程越多并发执行的任务就越多,但是并不意味着效率会一直提高,相反会得到适得其反的效果。
java中的多线程编程一共有三种方法:
继承Thread类
继承Runnable接口
使用线程池Executor
下面简单的介绍一些Executor的使用
一、话不多说先上代码:
创建一个线程数为3的线程池,模拟十个任务让线程池调度线程去完成。
package executorExample; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Threads{
private static final int nThreads = 3;
private int i;
public void Thread(){
//实现ExecutorService接口创建 线程数为三个的线程池
ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
for (i = 0; i < 10; i++) {
//在匿名内部类中变量index还在必须把index声明成final类型
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
String threadName = Thread.currentThread().getName();//获取当前线程的名字
System.out.println(threadName+"正在执行任务:"+index);
}
});
}
}
public static void main(String[] args){
Threads thread = new Threads();
thread.Thread();
}
}
接下来解释一下这段代码。在这段代码当中用到的关键词有ExcutorService,Executors,newFixedThreadPool和execute方法,还有一个最重要的Executor,现在来解释一下他们之间的关系
1、Executors
首先我们先看一下Executors的源码
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newWorkStealingPool(int parallelism) {
return new ForkJoinPool
(parallelism,
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
public static ExecutorService newWorkStealingPool() {
return new ForkJoinPool
(Runtime.getRuntime().availableProcessors(),
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
}
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory));
}
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(),
threadFactory);
}
里面有四种都是ExecutorService类型的线程池,也就是说,我们在创建线程池的时候可以有四种选择,newCachedThreadPool,newFixedThreadPool,newSingleThreadExecutor,newWorkStealingPool。其中最常用的就是newCatchedThreadPool和newFixedThreadPool,可以看到每个线程池的参数队列是不同的,LinkedBlockingQueue<Runnable>()属于无边界队列,
(1)newFixedThreadPool
是一个固定线程数的线程池,当线程池里线程满了之后,下载任务就会被阻塞到等待下载队列里面等待下载。而LinkedBlockingQueue<Runnable>()无限扩容的FIFO规则的队列,我们在编程的时候一般用它比较多。
(2)newCatchedThreadPool
是一个可缓存线程池,如果线程池里的线程数超过了处理需要,则线程池可以灵活的回收空闲的线程,
别的线程池就先不介绍了
2、ExecutorService
public interface ExecutorService extends Executor {
在接口ExecutorService的源码中我们可以看到继承了Executor类,并且在ExecutorService方法中实现了
void shutdown();
invokeAll();
submit();
等等的方法。
3、Executor
public interface Executor { void execute(Runnable command);
}
在接口Executor中只有一个execute()方法,这是用来将任务提交给线程的。
到这里就明白了他们之间的关系,这样可以帮助我们更好的利用线程池去提高我们的代码效率。
写的不是很完善,如果有大神,希望多多指教,写这个东西也是为了自己能够更熟练的使用线程池。
java线程池的创建使用的更多相关文章
- Java线程池的创建详解
本篇文章主要总结了Java创建线程池的三种方式以及线程池参数的详细说明,对线程池感兴趣的同学可以作为参考学习. 1)通过工具类java.util.concurrent.Executors的静态方法来创 ...
- JAVA线程池的创建与使用
为什么要用线程池? 我们都知道,每一次创建一个线程,JVM后面的工作包括:为线程建立虚拟机栈.本地方法栈.程序计数器的内存空间(下图可看出),所以线程过多容易导致内存空间溢出.同时,当频繁的创建和销毁 ...
- java线程池及创建多少线程合适
java线程池 1.以下是ThreadPoolExecutor参数完备构造方法: public ThreadPoolExecutor(int corePoolSize,int maximumPoolS ...
- java 线程池的创建方式
package com.nf147.Constroller; import java.util.concurrent.ExecutorService; import java.util.concurr ...
- JAVA线程池的创建
/** * 创建不同类型的线程池 Executors * * @author */ public class ThreadPoolTest01 { public static void main(St ...
- Java线程池的那些事
熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...
- 使用Java 线程池的利弊及JDK自带六种创建线程池的方法
1. 为什么使用线程池 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过网络协 ...
- Java线程池解析
Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
随机推荐
- 默认权限umask、文件系统权限、特殊权限
第1章 权限相关错误 1.1 普通用户 ls /root/ /root 属于root 普通用户没有任何权限,所以无法查看 [oldboy@znix ~]$ ls /root/ ls: cannot ...
- SSH三大框架整合步骤
Struts2:需要整合的第一个框架: 1.创建一个动态web项目 2.导入struts2必须的jar 放到 lib目录下 ,再 build path 添加web工程中 3.配置struts2的核心配 ...
- day2--通过setup设置网卡
配置IP地址,安装完成centos之后,需要配IP地址,流程如下: 1.首先开启虚拟机,如下: 2.登陆账号,root账户登陆,如下: 3.输入setup,按回车键进入,设置IP的方法有很多种,此处采 ...
- sql2012笔记
收缩数据库日志文件1.数据库右键-->Options-->Revovery model =Full 改成 Simple2.数据库右键-->Tasks-->Shrink--> ...
- [转载] Java安全体系简介
转载自http://blog.csdn.net/jbossweek/article/details/1458468 一.设计原则 独立性 安全服务独立于具体的应用,应用不需要单独实现,只需通过请求就可 ...
- 通过 Visual Studio 的“代码度量值”来改进代码质量
1 软件度量值指标 1.1 可维护性指数 表示源代码的可维护性,数值越高可维护性越好.该值介于0到100之间.绿色评级在20到100之间,表明该代码具有高度的可维护性:黄色评级在10到19之间,表示该 ...
- django作业练习
---权限管理系统 要求: 1,登陆: a,装饰器判断用户是否已经登陆 b,用户密码使用md5发送 2,注册 a,检测用户是否已经存在,onblur+ajax光标跳出输入框时(使用ajax) 3,注销 ...
- bzoj1015星球大战
1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...
- Python 动态添加类方法
习题: 1. Shape基类,要求所有子类都必须提供面积的计算,子类有三角形.矩形.圆. 2. 上题圆类的数据可序列化 第一种方法:使用Mixin多继承组合的方式,混入其它类的属性和方法 第二种方法: ...
- react入门到进阶(一)
一.何为react Facebook在F8会议上首次提出这个概念,一套全新的框架就此诞生. React 不是一个完整的 MVC.MVVM 框架,其只负责 View 层 React 跟 Web Comp ...