`
朱嘉华
  • 浏览: 236211 次
  • 性别: 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  
是不是没有写完啊

相关推荐

    java 四种线程池实例

    本文将深入探讨四种常见的Java线程池实例:`ThreadPoolExecutor`、`Executors`提供的固定线程池、单线程池和定时线程池。 1. **ThreadPoolExecutor**: 这是最基础也是最灵活的线程池实现,可以通过`new ...

    Android Executor线程池

    `Executor`线程池是一种优秀的解决方案,它可以帮助开发者更好地控制并发执行的任务,避免过度创建线程导致资源浪费和系统稳定性下降。本文将深入探讨`Android Executor`线程池的工作原理、优势以及如何在实际开发中...

    Java并发之串行线程池实例解析

    Java并发之串行线程池实例解析 Java并发之串行线程池实例解析是Java并发编程中非常重要的一部分,今天我们就来详细介绍如何实现一个串行的线程池实例。在介绍之前,首先我们需要了解什么是串行线程池。串行线程池是...

    Spring boot注解@Async线程池实例详解

    Spring Boot @Async 注解线程池实例详解 1. Spring Boot @Async 注解简介 Spring Boot 提供了 @Async 注解,可以将方法异步化,使得方法的调用者不需要等待方法的执行结果,直接返回,而方法的实际执行将提交给 ...

    jdk自带线程池实例详解

    jdk自带线程池实例详解 jdk自带的线程池是Java开发中一个非常重要的概念,特别是在多线程编程中。线程池是线程的容器,每次只执行额定数量的线程,线程池就是用来管理这些额定数量的线程。下面我们来详细了解jdk...

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

    SpringMVC配置线程池Executor做多线程并发操作的代码实例 在本文中,我们将探讨如何使用SpringMVC框架来配置线程池Executor,以实现多线程并发操作。线程池Executor是Spring框架提供的一种线程池实现,它允许我们在...

    线程池之Executor框架.docx

    - **任务**:Executor框架处理的主要对象是任务,任务可以是实现`Runnable`接口的实例,也可以是实现`Callable`接口的实例。`Runnable`接口的任务没有返回值,而`Callable`接口的任务可以返回一个结果。 - **任务...

    JAVA使用线程池查询大批量数据

    1. **创建线程池**:首先,我们需要创建一个线程池实例。通常,我们可以根据实际需求设置线程池参数。例如,如果数据量大且系统资源充足,可以适当增加线程数量;反之,若系统资源有限,应控制线程数量,避免资源...

    Java线程池使用说明

    5. Executors:包含了一系列静态工厂方法,用于生成不同类型的线程池实例。 常见的线程池实现包括: 1. newSingleThreadExecutor():创建一个单线程的线程池,保证任务按提交顺序串行执行。 2. ...

    Java Executor 框架的实例详解

    Java Executor 框架的实例详解 Java Executor 框架是 Java 中一个很重要的并发编程模型,主要用于并发任务的执行和管理。Executor 框架的实例详解可以帮助开发者更好地理解和使用 Executor 框架,以下是 Java ...

    线程池下载图片小demo

    1. 创建线程池实例,配置合适的参数。 2. 将每张图片的下载任务封装为Runnable或Callable对象。 3. 使用线程池的`execute()`或`submit()`方法提交任务。 4. 实现缓存机制,确保图片下载后被正确存储和检索。 5. 监控...

    关于线程池的代码demo

    在这个示例中,我们首先创建了一个固定大小为4的线程池,然后提交了10个任务(`WorkerThread`实例)。每个任务在`run`方法中模拟执行耗时操作,线程池会确保最多只有4个任务同时执行。当所有任务完成后,调用`...

    JDK线程池和Spring线程池的使用实例解析

    JDK线程池和Spring线程池的使用实例解析 JDK线程池和Spring线程池是两种常用的线程池实现,它们都提供了线程池的功能,但它们在使用和配置上有所不同。下面我们将详细介绍JDK线程池和Spring线程池的使用实例解析。 ...

    Java中多线程的使用线程池.docx

    3. **线程池接口与实现**:在Java中,`java.util.concurrent.Executor` 是线程池的顶级接口,它定义了执行任务的基本方法。`ExecutorService` 是实际的线程池接口,提供了更丰富的管理和控制线程池的方法。`...

    Executor框架使用详解

    基于`Executor`,`ExecutorService`接口提供了更丰富的功能,如关闭线程池的`shutdown()`和`shutdownNow()`方法,以及管理和控制任务执行的方法,如`submit()`、`invokeAll()`和`invokeAny()`。`ExecutorService`...

    线程池的使用介绍Demo,简单明了。

    在Android中,我们通常使用Java的Executor框架来创建和管理线程池。Java的ExecutorService接口是线程池的主要接口,而ThreadPoolExecutor类是它的具体实现。 三、线程池的参数 ThreadPoolExecutor的构造函数接收...

    Java Socket编程实例(三)- TCP服务端线程池

    总结来说,Java Socket编程中的TCP服务端线程池实例展示了如何利用线程池优化服务器性能,避免频繁创建线程,同时提供了一种优雅的方式来处理并发客户端请求。在实际开发中,结合Spring框架,我们可以更加灵活且高效...

    java线程池的使用方式

    在Java中,`Executor`接口是线程池的顶层接口,但更确切地说它是一个执行线程的工具而非线程池本身。真正代表线程池的是`ExecutorService`接口。为了简化线程池的配置和使用,`Executors`类提供了一系列静态工厂方法...

    socket 线程池实现(已经在项目中应用)

    在`SocketServer`类中,你需要创建一个`ExecutorService`实例,这是Java内置的线程池接口。你可以使用`Executors`工具类的静态方法来创建线程池,例如`newFixedThreadPool(int nThreads)`,它会创建一个固定大小的...

Global site tag (gtag.js) - Google Analytics