`
朱嘉华
  • 浏览: 232650 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Executor线程池实例

阅读更多

Executor 是 java5 下的一个多任务并发执行框架(Doug Lea),可以建立一个类似数据库连接池的线程池来执行任务。这个框架主要由三个接口和其相应的具体类组成。Executor、 ExecutorService 和 ScheduledExecutorService
   1 、 Executor 接口:是用来执行 Runnable 任务的;它只定义一个方法- execute(Runnable command);执行 Ruannable 类型的任务。
   2 、 ExecutorService 接口: 继承Executor接口,提供了执行Callable任务和中止任务执行的服务。
   3 、 ScheduledExecutorService 接口:继承 ExecutorService 接口,提供了按排程执行任务的服务。
   4 、 Executors 类:为了方便使用, 建议使用 Executors的工具类来得到 Executor 接口的具体对象。

 Executors 类有几个重要的方法,在这里简明一下:
    1 、 callable(Runnable task):      将 Runnable 的任务转化成 Callable 的任务
    2 、 newSingleThreadExecutor():    产生一个 ExecutorService 对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。
    3 、 newCachedThreadPool():        产生一个 ExecutorService 对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用。
    4 、 newFixedThreadPool(int poolSize):  产生一个 ExecutorService 对象,这个对象带有一个大小为 poolSize 的线程池,若任务数量大于 poolSize ,任务会被放在一个 queue 里顺序执行。
    5 、 newSingleThreadScheduledExecutor(): 产生一个 ScheduledExecutorService 对象,这个对象的线程池大小为 1 ,若任务多于一个,任务将按先后顺序执行。
    6 、 newScheduledThreadPool(int poolSize): 产生一个 ScheduledExecutorService 对象,这个对象的线程池大小为 poolSize ,若任务数量大于 poolSize ,任务会在一个 queue 里等待执行 。

  有关Executor框架其它类的说明请参看JAVA 5 的 API文档


  下面是几个简单的例子,用以示例Executors中几个主要方法的使用。
    1、 Task.java 任务
    2、 SingleThreadExecutorTest.java  单线程执行程序的测试
    3、 CachedThreadPoolTest.java      线程池线程执行程序的测试
    4、 FixedThreadPoolTest.java       线程池线程执行程序的测试(线程数固定)
    5、 DaemonThreadFactory.java       守护线程生成工厂
    6、 MaxPriorityThreadFactory.java  大优先级线程生成工厂
    7、 MinPriorityThreadFactory.java  小优先级线程生成工厂
    8、 ThreadFactoryExecutorTest.java 在自定义线程生成工厂下的测试

 

    1、 Task.java 任务

package com.thread;

//可执行任务
public class Task implements Runnable {
	// 中断信号
	volatile boolean stop = false;

	// 该任务执行的次数
	private int runCount = 0;

	// 任务标识
	private int taskId;

	public Task(int taskId) {
		this.taskId = taskId;
		System.out.println("Create Task-" + taskId);
	}

	// 执行任务
	public void run() {

		while (!stop) {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				System.out.println("Task interrupted...");
			}

			// 线程运行3次后,中断信号置为true
			if (++runCount == 3)
				stop = true;

			// 输出一些语句
			System.out.println("" + Thread.currentThread().toString()
					+ "\t\t\t\t execute Task-" + taskId + "'s " + runCount
					+ "th run. ");

		}
	}
}

 

    2、 SingleThreadExecutorTest.java  单线程执行程序的测试

 

package com.thread;

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

public class SingleThreadExecutorTest {

  public static void main(String[] args) {
    try {
      // 创建一个单线程执行程序
      ExecutorService executorService = Executors.newSingleThreadExecutor();
      for (int i =1; i <= 3; i++) {
        executorService.execute(new Task(i));
      }
      executorService.shutdown();
     
    } catch (Exception e) {}
  }
}

 

 3、 CachedThreadPoolTest.java      线程池线程执行程序的测试

package com.thread;

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

public class CachedThreadPoolTest {

  public static void main(String[] args) {
    try {
      // 建新线程的线程池,如果之前构造的线程可用则重用它们
      ExecutorService executorService = Executors.newCachedThreadPool();
      for (int i =1; i <= 4; i++) {
        executorService.execute(new Task(i));
      }
      executorService.shutdown();
     
    } catch (Exception e) {}
  }
}


  4、 FixedThreadPoolTest.java       线程池线程执行程序的测试(线程数固定)

package com.thread;

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

public class FixedThreadPoolTest {

  public static void main(String[] args) {
    try {
      // 创建固定线程数的线程池,以共享的无界队列方式来运行这些线程
      ExecutorService executorService = Executors.newFixedThreadPool(2);
      for (int i =1; i <= 5; i++) {
        executorService.execute(new Task(i));
      }
      executorService.shutdown();
     
    } catch (Exception e) {}
  }
}


     5、 DaemonThreadFactory.java       守护线程生成工厂

package com.thread;

import java.util.concurrent.ThreadFactory;

public class DaemonThreadFactory implements ThreadFactory {
 
  //创建一个守护线程
  public Thread newThread(Runnable r) {
    Thread t = new Thread(r);
    t.setDaemon(true);
    return t;
  }
}

 

分享到:
评论
2 楼 xchd 2014-07-29  
分别在什么时候(情况下)用ThreadFactory、Executors.newCachedThreadPool
1 楼 mikey_5 2013-06-23  
是不是没有写完啊

相关推荐

    springmvc配置线程池Executor做多线程并发操作的代码实例

    今天小编就为大家分享一篇关于springmvc配置线程池Executor做多线程并发操作的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    【python内功修炼011】:Python进程池和线程池详解

    文章目录一、关于线程池\进程池介绍1.1 池的概念1.2 池的划分1.3 线程池和进程池的区别1.5 进程池的...Executor模块4.2 Future模块4.3 模块其他实用函数五、程序实例5.1 进程池实例5.2 线程池实例5.3 同步和异步的实例...

    详解Java线程池和Executor原理的分析

    主要介绍了详解Java线程池和Executor原理的分析的相关资料,这里提供实例及分析原理帮助大家理解这部分知识,需要的朋友可以参考下

    一个开源的Java基础工具包

    此工具我不再更新,里面... 若想自定义线程池大小或独立控制,可调用newExecutor()实例化一个线程池 excAsync()执行一个异步方法 3、com.baijob.commonTools.thread.SyncQueue 阻塞队列,简化了JDK的BlockingQueue

    Java面试问题带答案40道.docx

    另外,还可以使用Executor框架或线程池来管理线程。 3. Java中什么是抽象类? 答:抽象类是一种不能被实例化的类,只能作为其他类的基类。它可以包含抽象方法,用于定义子类必须实现的方法。 4. Java中什么是接口...

    ArtConcurrentBook.rar

    《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...

    《Java并发编程的艺术》

    《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...

    Java并发编程的艺术

    《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...

    2017Java常考面试题 下载

    应用程序可以使用Executor框架来创建线程池 实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,...

    Java并发编程实战

    4.2 实例封闭 4.2.1 Java监视器模式 4.2.2 示例:车辆追踪 4.3 线程安全性的委托 4.3.1 示例:基于委托的车辆追踪器 4.3.2 独立的状态变量 4.3.3 当委托失效时 4.3.4 发布底层的状态变量 4.3.5 示例:发布...

    Java 并发编程实战

    4.2 实例封闭 4.2.1 Java监视器模式 4.2.2 示例:车辆追踪 4.3 线程安全性的委托 4.3.1 示例:基于委托的车辆追踪器 4.3.2 独立的状态变量 4.3.3 当委托失效时 4.3.4 发布底层的状态变量 4.3.5 示例:发布...

    BAT面试真题最新(涵盖全方面)

    java NIO的⼯工作原理 由⼀一个专⻔门的线程来处理理所有的 IO 事件,并负责分发。 事件驱动机制:事件到的时候触发,⽽而不不是同步的去监视事件。...应⽤用程序可以使⽤用Executor框架来创建线程池

    JAVA并发编程实践_中文版(1-16章全)_1/4

    4.2 实例限制 4.3 委托线程安全 4.4 向已有的线程安全类添加功能 4.5 同步策略的文档化 第5章 构建块 5.1 同步容器 5.2 发容器 5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 synchronizer 5.6 为...

    Java并发编程part2

    4.2 实例限制 4.3 委托线程安全 4.4 向已有的线程安全类添加功能 4.5 同步策略的文档化 第5章 构建块 5.1 同步容器 5.2 发容器 5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 synchronizer 5.6 为...

    Java并发编程实践part1

    4.2 实例限制 4.3 委托线程安全 4.4 向已有的线程安全类添加功能 4.5 同步策略的文档化 第5章 构建块 5.1 同步容器 5.2 发容器 5.3 阻塞队列和生产者一消费者模式 5.4 阻塞和可中断的方法 5.5 synchronizer 5.6 为...

    《Java并发编程的艺术》源代码

    第7章介绍了Java中的原子操作类,并给出一些实例。 第8章介绍了Java中提供的并发工具类,这是并发编程中的瑞士军刀。 第9章介绍了Java中的线程池实现原理和使用建议。 第10章介绍了Executor框架的整体结构和成员组件...

Global site tag (gtag.js) - Google Analytics