`

JAVA多线程的控制JAVA 5.0

    博客分类:
  • JAVA
阅读更多

    在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制 同时执行的线程数量就需要额外编写代码来完成。5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor, ExecutorService和ScheduledExecutorService,让我们先用一个图来显示它们的关系:


 
图的左侧是接口,图的右侧是这些接口的具体类。注意Executor是没有直接具体实现的。

 

Executor 接口: 是用来执行Runnable任务的,它只定义一个方法:

  • execute(Runnable command ):执行Ruannable类型的任务

ExecutorService 接口: ExecutorService继承了Executor的方法,并提供了执行Callable任务和中止任务执行的服务,其定义的方法主要有:

  • submit(task ):可用来提交Callable或Runnable任务,并返回代表此任务的Future对象
  • invokeAll(collection of tasks ):批处理任务集合,并返回一个代表这些任务的Future对象集合
  • shutdown():在完成已提交的任务后关闭服务,不再接受新任务
  • shutdownNow():停止所有正在执行的任务并关闭服务。
  • isTerminated():测试是否所有任务都执行完毕了。
  • isShutdown():测试是否该ExecutorService已被关闭

ScheduledExecutorService 接口 在ExecutorService的基础上,ScheduledExecutorService提供了按时间安排执行任务的功能,它提供的方法主要有:

  • schedule(task, initDelay ): 安排所提交的Callable或Runnable任务在initDelay指定的时间后执行。
  • scheduleAtFixedRate():安排所提交的Runnable任务按指定的间隔重复执行
  • scheduleWithFixedDelay():安排所提交的Runnable任务在每次执行完后,等待delay所指定的时间后重复执行。 

 

重要的Executors

虽然以上提到的接口有其实现的具体类,但为了方便Java 5.0建议使用Executors的工具类来得到Executor接口的具体对象,需要注意的是Executors是一个类,不是Executor的复数 形式。Executors提供了以下一些static的方法:

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

 

举例说明:

应用Executors来建立Thread pool

 

有时候您需要建立一堆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()方法。

  • 大小: 17.8 KB
分享到:
评论

相关推荐

    Java 5.0多线程编程

    java Java多线程 多线程 java Java多线程 多线程 java Java多线程 多线程

    Java5.0多线程编程

    最新Java 5.0多线程编程。

    Java多线程-JDK5.0新增线程创建方式

    Java多线程--JDK5.0新增线程创建方式

    Java5.0多线程编程实践.pdf

    Java5.0多线程编程实践.pdf

    多线程编程(电子书)

    Java自1995年面世以来得到了广泛得一个运用,但是对多...在Java 5.0之前Java里的多线程编程主要是通过Thread类,Runnable接口,Object对象中的wait()、 notify()、 notifyAll()等方法和synchronized关键词来实现的。

    java高性能数据库连接池V5.0

    此代码,经过1000数量级的多线程并发访问测试。在四核CPU下也进行了多线程测试。保证了连接池在真多线程上同步访问的安全性。 里面包含了一个公开的接口。使用这个接口里面的函数。可以轻易创建使用数据库连接池...

    java高手真经 光盘源码

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...

    (超赞)JAVA精华之--深入JAVA API

    1.7 Java 5.0多线程编程 1.8 Java Socket编程 1.9 Java的内存泄漏 1.10 抽象类与接口的区别 1.11 Java变量类型间的相互转换 2 JAVA与WEB 2.1 JMX规范 2.1.1 JMX概述 2.1.2 设备层(Instrumentation Level) 2.1.3 ...

    Java高手真经(编程基础卷)光盘全部源码 免积分

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...

    Java精华学习资料

    Java精华学习资料 深入JAVA API 深入理解嵌套类和内部类 文件和流 java中的一些常用词汇 ...Java 5.0多线程编程 Java Socket编程 Java的内存泄漏 抽象类与接口的区别 Java变量类型间的相互转换 ……

    22 尚硅谷Java JUC线程高级视频

    教程视频:在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类, 用于定义类似于线程的自定义子系统,包括线程池,...还提供了设计用于多线程上下文中 的 Collection 实现等;

    Java高手真经(编程基础卷)光盘全部源码

    javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16....

    Java面试宝典Beta5.0.pdf

    java面试经常问到的问题,java的基础问题,多线程,spring mvc框架,jsp资源.Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点

    java+JDK+examples.rar_Swing Examples_java Applet_java file handl

    169个实例,内容涉及Java的语言基础、面向对象程序设计、数字处理、数组与集合、字符串、异常处理、文件操作、多线程、Swing编程、图形和多媒体编程、反射机制、网络程序设计、数据库编程、Applet、Java与XML、Java ...

Global site tag (gtag.js) - Google Analytics