一.一个实现了Runnable接口的类

class MyThread implementsRunnable{private static int num = 0;

@Overridepublic voidrun() {while(true){synchronized(MyThread.class){++num;try{

Thread.sleep(500);

}catch(Exception e){

System.out.println(e.toString());

}

System.out.println(Thread.currentThread().getName()+ " " +num);

}

}

}

}

1. newCachedThreadPool()方法

CacheThreadPool会为每一个任务创建一个线程。非常常见的情况是,单个的Executor被用来创建和管理系统中的任务。shutdown()方法可以防止新的任务被提交给这个Executor。如果在shutdown()方法之后提交新任务,则会抛出java.util.concurrent.RejectedExecutionException异常。

public classMain{public static voidmain(String[] args){

ExecutorService exes=Executors.newCachedThreadPool();for(int i=0; i<5; ++i)

exes.execute(newMyThread());

exes.shutdown();

}

}

2.FixedThreadPool()方法

FixedThreadPool使用了优先的线程集来执行所提交的任务。有了它,你就可以一次性预先执行代价高的线程分配。也就是说如果设置的最大线程数量是x,而提交的线程数y,那么(y-x)对应的这些线程要等到前x个线程执行完毕才会执行。

下面的例子中,线程6一直不会有机会执行。因为run()方法中是 while(true), 可以将while(true)去掉,前5个线程执行完毕后,才会执行第6个线程。

public classMain{public static voidmain(String[] args){

ExecutorService exes= Executors.newFixedThreadPool(5);for(int i=0; i<6; ++i)

exes.execute(newMyThread());

exes.shutdown();

}

}

3.newSingleThreadExecutor()方法

public classMain{public static voidmain(String[] args){

ExecutorService exes=Executors.newSingleThreadExecutor();for(int i=0; i<5; ++i)

exes.execute(newMyThread());

exes.shutdown();

}

SingleThreadExecutor就像是线程数量为1的FixedThreadPool。这对于你希望在另一个线程中连续运行的事物(长期存活的任务)来说,都是很有用的。如果想SingleThreadExecutor提交了多个任务,那么这些任务将排队,每个任务都会在下一个任务开始之前结束,所有的任务将使用相同的线程。

二.一个实现了Callable接口的类(从任务中产生返回值)

class MyThread implements Callable{private static int num = 0;

@Overridepublic String call() throwsException {for(int i=0; i<5; ++i){synchronized(MyThread.class){++num;

Thread.sleep(200);

System.out.println(Thread.currentThread().getName()+ " " +num);

}

}return Thread.currentThread().getName() + " success!";

}

}

1.ExecutorService.submit()方法

public classMain{public static voidmain(String[] args){

ExecutorService exes=Executors.newCachedThreadPool();

ArrayList> rets = new ArrayList>();for(int i=0; i<5; ++i)

rets.add(exes.submit(newMyThread()));for(Futurefs : rets){try{

System.out.println(fs.get());

}catch(InterruptedException e) {

e.printStackTrace();

}catch(ExecutionException e) {

e.printStackTrace();

}

}

}

}

submit()会产生Future对象,它用Callable返回结果的特定类型进行了参数化。可以调用Future的isDone()方法来查询Future是否已经完成。调用Future的get()方法来获取最终线程的执行结果。另外,Future的get()方法是一个阻塞方法,直到结果准备就绪。

三.线程的优先级

class MyThread implementsRunnable{private intpriority;publicMyThread(){

}public MyThread(intpriority){this.priority =priority;

}private static int num = 0;private volatile doubled;

@Overridepublic voidrun() {

Thread.currentThread().setPriority(priority);while(true){for(int i=0; i<100000; ++i){

d+= (Math.PI+Math.E)/(double)i;if(i%1000 == 0)

Thread.yield();

}synchronized(MyThread.class){++num;try{

Thread.sleep(500);

}catch(Exception e){

System.out.println(e.toString());

}

System.out.println(Thread.currentThread().getName()+ " " +num);

}

}

}

}public classMain{public static voidmain(String[] args){

ExecutorService exes=Executors.newCachedThreadPool();for(int i=0; i<5; ++i)

exes.execute(newMyThread(Thread.MIN_PRIORITY));

exes.execute(newMyThread(Thread.MAX_PRIORITY));

exes.shutdown();

}

}

volatile变量保证编译器对循环不进行任何的优化,如果不加入这些运算的话,就不会看到设置线程优先级的效果。数学运算是可以中断的,向控制台打印不能被中断。这里预案算时间足够的长,因此线程调度机制才来的及介入,交换任务并关注优先级,是的最高优先级被优先选择。

四.后台线程

class SimpleDaemons implementsRunnable{

@Overridepublic voidrun() {while(true){try{

TimeUnit.MILLISECONDS.sleep(200);

System.out.println(Thread.currentThread().getName());

}catch(InterruptedException e){

System.out.println(Thread.currentThread().getName()+ " : InterruptException!");

e.printStackTrace();

}

}

}

}public classMain{public static void main(String[] args) throwsInterruptedException{for(int i=0; i<10; ++i){

Thread daemon= new Thread(newSimpleDaemons());

daemon.setDaemon(true);

daemon.start();

}

System.out.println("All daemons started");

TimeUnit.MILLISECONDS.sleep(1000);

}

}

所谓后台线程,是指程序运行的时候在后台提供一种通用的服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有的后台线程。反过来说,只要任何非后台线程还在运行,程序就不会终止。

通过定制自己的ThreadFactory, 可以定制有Executor创建的线程的属性(后台,优先级,名称)

class DaemonThreadFactory implementsThreadFactory{

@OverridepublicThread newThread(Runnable r) {

Thread t= newThread(r);

t.setDaemon(true);returnt;

}

}

class DaemonFromFactory implementsRunnable{

@Overridepublic voidrun() {try{

TimeUnit.MILLISECONDS.sleep(100);

System.out.println(Thread.currentThread().getName());

}catch(InterruptedException e){

e.printStackTrace();

}

}

}public classMain{public static void main(String[] args) throwsInterruptedException{

ExecutorService exes= Executors.newCachedThreadPool(newDaemonThreadFactory());for(int i=0; i<5; ++i)

exes.execute(newDaemonFromFactory());

System.out.println("All Daemos Started!");

TimeUnit.MILLISECONDS.sleep(1000);

}

}

java执行器是什么_java使用Executor(执行器)管理线程相关推荐

  1. java 主线程等待_JAVA 主线程等待子线程执行完毕后在执行。线程同步 | 学步园...

    线程同步器机制有: 障栏: 倒计时门栓: 交换器: 同步队列: 信号量: 需求描述: 最近项目需要实现批量请求另外一个http协议的接口处理业务信息,并根据处理结果的返回值,更新系统业务状态. 鉴于系 ...

  2. java 利特尔法则_Java Web应用中调优线程池的重要性

    不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程 ...

  3. java 禁止使用多线程_Java多线程(四)-线程状态的转换 - Java 技术驿站-Java 技术驿站...

    一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法 ...

  4. java 多线程的使用_Java的多线程1:线程的使用

    概述 public enumState {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread stat ...

  5. java队列等待唤醒_Java深入学习29:线程等待和唤醒的两个方案

    Java深入学习29:线程等待和唤醒的两个方案 模拟场景 一个门店,有一个店员,有消费者来消费商品(每次消费1件商品),有仓库人员来添加(生产)商品(每次生产1件商品),并假设库存上限是2. 基础代码 ...

  6. java多线程同时运行_Java实现的两个线程同时运行案例

    本文实例讲述了Java实现的两个线程同时运行.分享给大家供大家参考,具体如下: /** * 两个案例同时运行案例 * 1:这个两个线程并不是有规律的运行而是有没有规律的交替运行 */ package ...

  7. Java hdfs连接池_Java使用连接池管理Hdfs连接

    记录一下Java API 连接hadoop操作hdfs的实现流程(使用连接池管理). 以前做过这方面的开发,本来以为不会有什么问题,但是做的还是坑坑巴巴,内心有些懊恼,记录下这烦人的过程,警示自己切莫 ...

  8. java notifyall 唤醒顺序_Java的多线程NotiFyAll()唤醒线程时的顺序问题 | 学步园

    public class ThreadPriority {public static void main(String[] args) {Producer p = new Producer();p.s ...

  9. java库存信息管理系统_Java商户管理系统 客户管理 库存管理 销售报表 SSM项目源码...

    系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM ...

最新文章

  1. 1.8M超轻量目标检测模型NanoDet,比YOLO跑得快
  2. Leetcode 207. 课程表 解题思路及C++实现
  3. 【Linux】22.当前运行的docker修改环境后,想在本地保存为镜像的方法
  4. VTK:vtkBoxWidget用法实战
  5. Node.js 部署免费/自动续订 HTTPS
  6. java容器doc_关于Java容器类学习心得体会.doc
  7. android版本怎么设置,安卓系统手机怎么用
  8. mysql和sqlserver读写分离_C#简单构架之EF进行读写分离+多数据库Mysql/SqlServer
  9. ssas报表项目数据集_如何部署SSAS多维数据集
  10. 合肥信息技术职业学院计算机模拟考试准考证,【通知】全国计算机等级考试模拟测试通知...
  11. rabbits php实现文件下载!
  12. android仿winphone进度指示器的实现
  13. 通过bootstrap4框架制作商城网页
  14. xp计算机无法关机,xp系统不能关机解决方法【图文教程】
  15. laravel entrust 权限管理
  16. 西南交通大学计算机考研资料汇总
  17. codeforce 427 C. Checkposts(tarjan 强连通分量)
  18. 互联网项目团队成员及能力组成的金字塔和倒金字塔模型
  19. 看到一篇详细的关于Python之Numpy教程分享给和我一样在编程上的小白
  20. php如何获得系统时间,php如何获取系统时间

热门文章

  1. CheckStyle, 强制你遵循编码规范
  2. 解决Windows7修改hosts时提示:您没有权限在此位置中保存文件
  3. AD备份文件安装额外域控制器
  4. C语言实现链式栈(LinkStack)
  5. 基于Bind实现的DNS正反向解析及主从DNS的配置
  6. 将你的 CentOS 变成 OSPF 路由器
  7. mac 安装 RabbitMQ
  8. 对于数据库中表示状态或类型字段表示方法的思考
  9. Web.xml配置详解之context-param
  10. discuz(dz) SSO(单点,同歩,异步)登录 --转