`
chenhua_1984
  • 浏览: 1250264 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Java 的ExecutorService

    博客分类:
  • java
阅读更多

      早期在Java5以前,我们做多线程程序,一般都用原生的Java的多线程API,比如 new Thread(), start ,wait,notify等 ,如果想实现并行任务,那么一般都是For循环来处理。在java 5以后,Sun公司给我们提供了一个比较好用的框架,那就是ExecutorService。新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特 性。

 

一、创建一个任务

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

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

 

二、执行任务

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

 

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

 

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

executorService.execute(new TestRunnable());创建ExecutorService

        ExecutorService executorService = Executors.newCachedThreadPool();

        ExecutorService executorService = Executors.newFixedThreadPool(100);

        ExecutorService executorService = Executors.newSingleThreadExecutor();

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

 

几个简单的例子

public void test1() 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());

           }

       });

    }

 两个都会执行,但程序只会使用一个线程来运行

 

public void test2() 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();

                     }

                  }

              }

           });

       }

    }

 一共创建了四个线程,每次每个线程都会执行输出,但不按顺序

 

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("完成....");

    }

   

    第三个例子主要实现了Callable接口,通过实现这个接口,可以实现线程在执行任务之后有返回值,也可以在这个地方,实现比如多个任务同时执行完成后在进行下一轮,或者其中一个任务执行失败后其他任务停止执行的功能

 for(Future<String> f:result){
           System.err.println("返回值:"+f.get());//输出返回的值
 }

 

 

 

分享到:
评论

相关推荐

    java ExecutorService使用方法详解

    Java中的`ExecutorService`是Java并发编程的重要组成部分,它提供了线程池的管理,使得开发者可以更有效地控制并发任务的执行。在Java的`java.util.concurrent`包中,`ExecutorService`接口作为线程池的核心接口,...

    Java线程超时监控

    首先,我们可以使用`java.util.concurrent`包中的`Future`和`ExecutorService`来实现线程超时。`ExecutorService`是一个接口,它提供了管理和控制线程池的能力,而`Future`则表示异步计算的结果。当我们提交一个任务...

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

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

    java线程池工具--ExecutorService,简单例子

    NULL 博文链接:https://x125858805.iteye.com/blog/2191873

    详解Java利用ExecutorService实现同步执行大量线程

    Java中的ExecutorService是Java并发编程的重要组成部分,它提供了一种高效、灵活的方式来管理和控制线程的执行。在处理大量线程或并发操作时,ExecutorService能够确保系统的稳定性和资源的有效利用,避免线程间的不...

    Java ExecutorService四种线程池使用详解

    在Java多线程编程中,`ExecutorService` 是线程池的核心接口,它提供了一种管理线程的方式,包括创建、调度和终止线程。Java的`java.util.concurrent`包中提供了`ExecutorService`的实现类,特别是通过`Executors`...

    Executor,Executors,ExecutorService比较.docx

    在Java并发编程中,`Executor`、`Executors`和`ExecutorService`是核心组件,它们帮助开发者高效管理线程资源,提高程序的并发性能。理解这三个概念的区别和用途是编写高性能并发程序的关键。 1. **Executor** `...

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

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

    java线程池常用方法.docx

    `java.util.concurrent.Executors`类提供了一系列静态方法用于创建不同类型的`ExecutorService`: - **newCachedThreadPool**:创建一个可根据需要创建新线程的线程池。如果线程池长度超过处理任务所需要的长度,可...

    Java 模拟线程并发

    在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable接口以及使用ExecutorService和Future等高级API。下面将详细探讨这些知识点。 首先,Java中创建线程主要有两种方法。一种是通过继承Thread...

    multithread:使用 Java8 ExecutorService 的简单多线程示例

    Java 8 提供了 `java.util.concurrent.ExecutorService` 接口,它是管理线程执行的主要工具,简化了多线程编程。下面将详细介绍如何使用 `ExecutorService` 实现简单的多线程示例。 1. **ExecutorService**:...

    java多线程并发

    `ExecutorService`是Java并发工具包中的核心接口之一,它定义了一组线程池管理的方法,可以帮助我们更加高效地管理和调度线程。 - **固定大小的线程池**:`newFixedThreadPool(int nThreads)`创建一个可重用的固定...

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

    线程池(java.util.concurrent.ExecutorService) 为了解决频繁创建和销毁线程的开销,Java提供了线程池的概念。线程池是一组预先创建的线程,用于处理到来的任务。`ExecutorService` 接口和它的实现类(如 `...

    java 线程池管理类:Executors_.docx

    `java.util.concurrent.Executors` 继承自 `java.lang.Object`,作为一个工具类,它提供了一系列用于创建和管理线程池的方法,包括`ExecutorService`、`ScheduledExecutorService`、`ThreadFactory`和`Callable`等...

    JAVA简单实现截屏

    可以使用Java的`ExecutorService`和`Future`来实现: ```java ExecutorService executor = Executors.newSingleThreadExecutor(); Future&lt;BufferedImage&gt; futureCapture = executor.submit(() -&gt; robot....

    java实现后台进程

    Java并发库中的ExecutorService和Future接口提供了更高级的线程管理功能。ExecutorService可以创建线程池,提高多线程环境下的性能和资源利用率。Future接口用于获取异步计算的结果: ```java ExecutorService ...

    java多线程处理数据库数据

    然而,为了更好地管理和控制线程,Java并发包提供了如`ExecutorService`、`Future`、`Callable`等高级接口和类,它们简化了多线程编程,并提供了更好的资源管理。 在处理数据库数据时,我们通常会使用JDBC(Java ...

    java大批量导入excel,多线程加分片处理的dome

    ### Java大批量导入Excel:多线程加分片处理详解 #### 概述 在实际工作中,经常需要批量处理大量的Excel数据。当面对成千上万甚至百万级别的数据时,简单的单线程处理方式往往无法满足效率的需求。为了解决这个...

    Java多线程示例 可以直接运行

    Java提供了ExecutorService和ThreadPoolExecutor类来管理线程。通过线程池,可以有效地控制并发线程的数量,避免大量创建和销毁线程的开销。创建线程池的示例: ```java ExecutorService executor = Executors....

    java 线程池

    Java中创建线程池的主要工具类是`java.util.concurrent.ExecutorService`,它提供了一种标准的方式创建不同类型的线程池。常用的线程池实现包括: 1. **FixedThreadPool**:创建固定大小的线程池,可以复用指定数量...

Global site tag (gtag.js) - Google Analytics