`
zhiying201039
  • 浏览: 43138 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中应用Executors来建立Thread pool

    博客分类:
  • Java
 
阅读更多

有时候您需要建立一堆Thread来执行一些小任务,然而频繁的建立Thread有时会是个开销,因为Thread的建立必须与作业系统互动,如果能建立一个Thread pool来管理这些小的Thread并加以重复使用,对于系统效能会是个改善的方式。

您可以使用Executors来建立Thread pool,Executors有几个static方法,列出如下:
 

方法 说明
newCachedThreadPool 建立可以快取的Thread,每个Thread预设可idle 60秒

newFixedThreadPool

包括固定数量的Thread

newSingleThreadExecutor

只有一个Thread,循序的执行指定给它的每个任务
newScheduledThreadPool 可排程的Thread
newSingleThreadScheduledExecutor 单一可排程的Thread

举个简单的实例,下面的程式使用newFixedThreadPool方法建立Thread pool,当中包括五个可以重复使用的Thread,您可以指定Runnable物件给它,程式中会产生十个Runnable物件,由于Thread pool中只有五个可用的Thread,所以后来建立的五个Runnable必须等待有空闲的Thread才会被执行:
  • ExecutorDemo.java
package onlyfun.caterpillar;

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

public class ExecutorDemo {
	public static void main(String[] args) {
		ExecutorService service = Executors.newFixedThreadPool(5);
		
		for(int i = 0; i < 10; i++) {
			final int count = i;
			service.submit(new Runnable() {
				public void run() {
					System.out.println(count);
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
			});
		}
		
		service.shutdown(); // 最后记得关闭Thread pool
	}
}


submit()方法也接受实作Callable介面的物件,最后传回Future物件,可以取得Callable执行过后的传回结果。

如果想利用Executors进行排程,例如排定某个工作30秒后执行:
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );
        scheduler.schedule(new Runnable( ) {
                               public void run() {
                                   // 排程工作
                               }
                           }, 
                           30, TimeUnit.SECONDS);


或排定某个工作5秒后执行,之后每30秒执行一次:
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );
        final ScheduledFuture future = scheduler.scheduleAtFixedRate(new Runnable( ) {
                               public void run() {
                                   // 排程工作
                                   System.out.println("t");
                               }
                           }, 
                           0, 5, TimeUnit.SECONDS);
        
        // 排定 60 秒后取消future
        scheduler.schedule(new Runnable( ) {
            public void run( ) {
              future.cancel(false);
            }
          }, 60, TimeUnit.SECONDS);



如上所示,想要取消排程任务,可以呼叫ScheduledFuture的cancel()方法。

来源:http://blog.csdn.net/HuDon/article/details/1922563

分享到:
评论

相关推荐

    java 线程池管理类:Executors_.docx

    `java.util.concurrent.Executors`类提供了丰富的工具方法来帮助开发者轻松创建和管理不同类型的线程池。通过合理选择和配置线程池,可以在提高程序执行效率的同时,有效地控制系统资源消耗。理解`Executors`类中...

    commons-poo ljar包

    Apache Commons Pool是一个开源项目,提供了一种对象池化机制,它是Java编程中实现线程池技术的重要组件。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以...

    Android代码-java-concurrency-patterns

    Java Concurrency Patterns and Features Concurrency Patterns and features found in Java, through multithreaded programming....Scheduled Thread Pool Atomics Futures FutureTask CompletableFuture Java M

    Java-Thread-Pool-example:一个简单的 Java 线程池示例

    在这个"Java-Thread-Pool-example"中,我们将深入探讨Java线程池的实现、优势以及如何使用它。 Java中的线程池是通过`java.util.concurrent`包下的`ExecutorService`接口和`ThreadPoolExecutor`类来实现的。`...

    Java中的线程与线程池.pptx

    总之,理解Java中的线程和线程池原理,以及如何正确使用它们,对于编写高性能、高并发的Java应用程序至关重要。通过合理配置和管理线程池,我们可以实现更有效的资源利用,避免潜在的性能瓶颈和系统异常。

    5_Executors源码阅读1

    总结来说,`Executors`是Java并发编程中不可或缺的一部分,它简化了线程池、线程工厂和Callable的创建过程,同时也提供了丰富的配置选项,帮助开发者构建稳定、高效的多线程环境。正确理解和使用`Executors`,能够让...

    java定时器\多线程(池)\java队列Demo

    ExecutorService executor = Executors.newFixedThreadPool(poolSize); executor.execute(new Runnable() { @Override public void run() { // 执行任务的代码 } }); executor.shutdown(); // 关闭线程池 ``` #...

    java扫描局域网活动主机

    这个程序可能是一个小型的Java应用,利用了多线程技术和线程池来提高扫描速度,确保在短时间内高效地完成对局域网内设备的探测。 线程池是Java并发编程中的一个重要概念,它通过维护一组可重用的预先创建的线程来...

    Java开发手册(阿里巴巴带-alibaba-IDE插件)

    《阿里巴巴Java开发手册》是阿里内部Java工程师所遵循的开发规范,涵盖编程规约、单元测试规约、异常日志规约、MySQL规约、工程规约、安全规约等,这是近万名阿里Java技术精英的经验总结,并经历了多次大规模一线...

    关于Thread讲解

    在Java中,可以通过继承`Thread`类或实现`Runnable`接口来创建线程。 - **通过继承Thread类**: ```java public class MyThread extends Thread { @Override public void run() { // 线程执行的代码 } } ...

    java获取压缩文件的名称并解压

    ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE); List&lt;Future&lt;Void&gt;&gt; futures = new ArrayList(); for (ZipEntry entry : Collections.list(zip.entries())) { futures.add...

    Java多线程实现.pdf

    在Java中,可以使用`Executors`类的静态方法如`newFixedThreadPool`来创建线程池。例如,`Executors.newFixedThreadPool(10)`会创建一个包含10个线程的固定大小的线程池。 网络服务器模型通常包含以下步骤: 1. ...

    线程-线程池-锁-集合-Map-队列.docx

    在Java中,使用`ExecutorService`和`ThreadPoolExecutor`来创建线程池,而不是直接使用`Executors`,因为`Executors`创建的线程池可能会导致资源耗尽的问题。 集合是Java中存储数据的主要工具,包括List、Set和Map...

    Java 5_0 多线程编程实践

    在Java 5.0版本中,多线程编程得到了显著增强,特别是在引入了`java.util.concurrent`包之后,为开发者提供了更为丰富的API来处理并发问题。本篇文章将深入探讨如何在Java 5.0中有效地运用这些新特性来进行多线程...

    线程四笔记,对于正在学习Java的朋友可以参考一下

    在Java中,有两种主要的创建线程的方式:实现Runnable接口和继承Thread类。 1. **实现Runnable接口**: - 创建一个类实现Runnable接口,重写run()方法,这个run()方法就是线程执行体。 - 创建Thread类的实例,将...

    100行Java代码构建一个线程池[借鉴].pdf

    在Java中,实现线程池可以通过继承Thread类或实现Runnable接口创建自定义线程,然后使用ThreadPoolManager类进行管理。Java内置了`java.util.concurrent`包,提供了ExecutorService接口和ThreadPoolExecutor类,可以...

    java多线程编程总结

    Java中实现多线程的方式主要包括:继承`Thread`类、实现`Runnable`接口以及使用`ExecutorService`、`Callable`、`Future`来实现有返回结果的多线程。本文将详细介绍这几种方式的具体实现与应用场景。 #### 二、继承...

    80w字Java面试宝典(非常全)

    ava八股文通常是指Java技术面试中常见的知识点集合,...线程池及并发包:Executors、ForkJoinPool、CountDownLatch、CyclicBarrier等。 并发优化:CAS、无锁编程、AQS原理等。 内容不限于这些,适合中、大厂面试来用!

    Java多线程的4种实现方式(源代码)

    Java多线程作为Java编程中的核心概念之一,在提高程序执行效率和增强应用响应性方面发挥着重要作用。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程中的多个线程...

    Java多线程实现[参考].pdf

    Java多线程编程是软件开发中的重要组成部分,特别是在构建高性能的服务器端应用时。Java 5引入了新的并发包`java.util.concurrent`,极大地提升了多线程编程的易用性和效率。本文通过一个网络服务器模型,展示了如何...

Global site tag (gtag.js) - Google Analytics