`

线程池ExecutorService

    博客分类:
  • java
 
阅读更多

声明:本人所有摘抄作者原文只是为方便学习,收藏所用。

为防经典好文原作者删除而看不到所用。

请原作者请勿见怪!如原作者不喜欢可以邮件给我,本人会在第一时间删除,谢谢!

原文:http://www.open-open.com/lib/view/open1335829640968.html

线程池ExecutorServicesubmitexecute

Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。在Java5以后,通过 Executor来启动线程比用Threadstart()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特 性。

 

一、创建任务

 

任务就是一个实现了Runnable接口的类。

创建的时候实run方法即可。

 

二、执行任务

 

通过java.util.concurrent.ExecutorService接口对象来执行任务,该接口对象通过工具类java.util.concurrent.Executors的静态方法来创建。

 

Executors此包中所定义的 ExecutorExecutorServiceScheduledExecutorServiceThreadFactory  Callable 类的工厂和实用方法。

 

ExecutorService提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以关闭ExecutorService,这将导致其停止接受新任务。关闭后,执行程序将最后终止,这时没有任务在执行,也没有任务在等待执行,并且无法提交新任 务。

executorService.execute(new TestRunnable());

 

1、创建ExecutorService

通过工具类java.util.concurrent.Executors的静态方法来创建。

Executors此包中所定义的 ExecutorExecutorServiceScheduledExecutorServiceThreadFactory  Callable 类的工厂和实用方法。

 

比如,创建一个ExecutorService的实例,ExecutorService实际上是一个线程池的管理工具:

        ExecutorService executorService = Executors.newCachedThreadPool();

        ExecutorService executorService = Executors.newFixedThreadPool(3);

        ExecutorService executorService = Executors.newSingleThreadExecutor();

 

2、将任务添加到线程去执行

当将一个任务添加到线程池中的时候,线程池会为每个任务创建一个线程,该线程会在之后的某个时刻自动执行。

 

示例1

    @Test

    public void testDemo() throws Exception {

       //单例线程,任意时间(同一时间)池中只能有一个线程

       ExecutorService es = Executors.newSingleThreadExecutor();

       es.execute(new Runnable() {

           @Override

           public void run() {

              System.err.println("线程启动并运行"+Thread.currentThread().getName());

           }

       });

       es.execute(new Runnable() {

           @Override

           public void run() {

              System.err.println("第二个也运行了"+Thread.currentThread().getName());

           }

       });

       //Thread.sleep(1000 * 60 * 60);

    }

运行结果如下:两个都会执行,但程序只会使用一个线程来运行。

线程启动并运行pool-1-thread-1

第二个也运行了pool-1-thread-1

 

示例2:

    @Test

    public void testDemo3() throws Exception {

       //声明一个线程池

       ExecutorService ex = Executors.newCachedThreadPool();

       for (int i = 0; i < 4; i++) {

           final int a = i;

           //每一次execute方法,都是向池中放入一个对象

           ex.execute(new Runnable() {

              public void run() {

                  while(true){

                     System.err.println("测试...."+a+">"

                            +Thread.currentThread().getName()+","

                            +Thread.currentThread().isDaemon());

                     try{

                         Thread.sleep(2000);

                     }catch(Exception e){

                         e.printStackTrace();

                     }

                  }

              }

           });

       }

       Thread.sleep(1000*60*60);

    }
输出的结果如下:从中可以发现,第四个一组输出,即一共创建了四个线程,每次每个线程都会执行输出,但不按顺序:位每一次输出都四个算是一组

测试....0>pool-1-thread-1,false

测试....3>pool-1-thread-4,false

测试....2>pool-1-thread-3,false

测试....1>pool-1-thread-2,false

测试....0>pool-1-thread-1,false

测试....3>pool-1-thread-4,false

测试....2>pool-1-thread-3,false

测试....1>pool-1-thread-2,false

测试....1>pool-1-thread-2,false

测试....2>pool-1-thread-3,false

测试....3>pool-1-thread-4,false

测试....0>pool-1-thread-1,false

 

示例3:

    public void testCall() throws Exception{

       //声明一个类,可以被调用,类似于线程,但它可以拥有返回值

       class MyCall implements Callable<String>{

           private int seq;

           public MyCall(int seq){

              this.seq=seq;

           }

           //抛出异常并可以拥有返回值

           public String call() throws Exception {

              System.err.println("执行"+seq+","+Thread.currentThread().getName());

              Thread.sleep(3000);

              System.err.println("Weak up "+seq);

              return "完成"+seq;//这是返回值

           }

       }

       ExecutorService es = Executors.newCachedThreadPool();//创建线程池对象

       List<Future<String>> result =new ArrayList<Future<String>>();//放结果用的集合

       for(int i=0;i<3;i++){

           Future<String> f=es.submit(new MyCall(i));//线程执行完成以后可以通过引用获取返回值

           result.add(f);

       }

       for(Future<String> f:result){

           System.err.println("返回值:"+f.get());//输出返回的值

       }

       System.err.println("完成....");

    }

分享到:
评论

相关推荐

    在spring boot中使用java线程池ExecutorService的讲解

    在 Spring Boot 中使用 Java 线程池 ExecutorService 的讲解 Spring Boot 作为一个流行的 Java 框架,提供了许多便捷的功能来帮助开发者快速构建应用程序。其中之一就是使用 Java 线程池 ExecutorService 来管理...

    Java 线程池ExecutorService详解及实例代码

    Java线程池ExecutorService是Java并发编程中非常重要的一个组件,它通过管理和复用线程资源,有效地控制并发任务的执行,从而提高系统的性能和稳定性。本文将详细讲解ExecutorService的原理、使用场景以及如何通过...

    Java线程池.docx

    Java线程池 Java线程池是Java语言中的一种高级多线程处理机制,用于避免重复创建和销毁线程而导致额外的性能开销。Java线程池功能可以实现线程的复用,提高了系统的性能和效率。 Java线程池分类 Java线程池可以...

    Android-扩展BaseAdapter实现progressBar下载

    创建线程池ExecutorService和资源 * 7.创建MyBaseadapter带参构造函数(Context context) * 8.创建ViewHolder对象用于存储那些Item内部的View的直接引用 * 9.getView()中判断convertView是否为空,防止过多填充...

    Android异步加载图像小结 (含线程池,缓存方法)(实用1).zip

    在Android中,可以使用`ExecutorService`来创建线程池。线程池可以预先配置好一定数量的线程,避免频繁创建销毁线程的开销。常用的线程池有固定大小线程池、单线程线程池等。例如,我们可以创建一个固定大小的线程池...

    java线程池

    - **ExecutorService**:这是Java中线程池的主要接口,它定义了线程池的核心操作,如提交任务、关闭线程池等。 - **ThreadPoolExecutor**:它是`ExecutorService`的一个具体实现,提供了创建线程池的方法,并允许...

    使用Java匿名内部类实现一个简单的线程池.txt

    ### 使用Java匿名内部类实现一个简单的线程池 #### 一、引言 在现代软件开发中,线程池是管理并发任务的重要工具之一。它能够有效地控制运行中的线程数量,合理分配系统资源,避免频繁创建销毁线程带来的性能开销...

    java内置线程池 !!!

    ExecutorService pool = new ThreadPoolExecutor( 5, // 核心线程数 10, // 最大线程数 60L, TimeUnit.SECONDS, // 空闲线程存活时间 new LinkedBlockingQueue(10), // 任务队列 Executors....

    ExecutorService线程池

    ExecutorService线程池是Java并发编程中的核心组件,它位于`java.util.concurrent`包下,是`java.util.concurrent.Executor`接口的一个实现。ExecutorService提供了一种管理线程的方式,允许我们创建、管理和控制...

    线程超时死掉

    解决线程的死掉问题和超时问题特别好使,在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现。 Future接口是Java标准API的一部分,在java.util.concurrent...

    JAVA主线程等待子线程执行完毕再执行[参照].pdf

    static ExecutorService executorService = Executors.newFixedThreadPool(1); public static void main(String[] args) throws Exception { // 创建线程并提交线程,同时获取一个 Future 对象 Thread ...

    futuretask用法及使用场景介绍

    如果使用同步计算,可能会导致主线程阻塞,而使用FutureTask可以将计算任务交给线程池执行,主线程可以继续执行其他任务,而不需要等待计算结果。 二、FutureTask的执行多任务计算的使用场景 FutureTask可以与...

    AsyncTask使用及源码解析

    在源码层面,AsyncTask主要依赖了线程池ExecutorService和FutureTask。ExecutorService负责调度和执行任务,FutureTask则提供了异步计算的结果。AsyncTask通过内部的SerialExecutor保证了同一时间只有一个任务在执行...

    多线程执行完后主程序再执行(包括需要子线程返回结果)

    `ExecutorService`接口和它的实现类如`ThreadPoolExecutor`提供了创建和管理线程池的功能。下面是一个简单的例子,演示如何创建线程池,提交任务,以及等待所有任务完成: ```java import java.util.concurrent.*; ...

    使用Java并发编程实现一个简单的银行账户管理系统.txt

    2. **线程池ExecutorService**: - Java的`ExecutorService`接口提供了一种管理线程的方法,它可以控制线程数量、线程生命周期以及执行策略等。 - 示例中的`main`方法使用`Executors.newFixedThreadPool(NUM_...

    基于JAVA的网络通讯系统设计与实现(论文+系统).rar

    在网络通信中,一个服务器可能需要同时处理多个客户端的请求,这就需要利用JAVA的并发编程特性,如Thread类或者Runnable接口,以及线程池ExecutorService来实现多任务并行处理。 此外,设计良好的网络通信系统还...

    多线程实例+源代码

    6. **线程池ExecutorService**:ExecutorService允许我们创建和管理线程池,有效地管理和复用线程,降低系统资源消耗,提高效率。 7. **Java新特性:CompletableFuture**:Java 8引入的CompletableFuture类提供了一...

    java并发资料

    ThreadPoolExecutor是ExecutorService的实现,可以通过配置参数来调整线程池的大小、队列容量等,以适应不同的并发需求。 六、并发设计模式 在并发编程中,有一些经典的模式如生产者-消费者模式、双端队列模式和...

    Java实现的多线程下载工具

    3. **线程池ExecutorService**: - `ExecutorService`是`java.util.concurrent`包下的接口,提供了线程池服务,可以管理线程的生命周期,提高系统效率。 - 常用的实现类有`ThreadPoolExecutor`,可以通过`...

Global site tag (gtag.js) - Google Analytics