[转帖]Executor线程池实例_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2361 | 回复: 0   主题: [转帖]Executor线程池实例        下一篇 
panpan.nie
注册用户
等级:大校
经验:4754
发帖:217
精华:2
注册:1970-1-1
状态:离线
发送短消息息给panpan.nie 加好友    发送短消息息给panpan.nie 发消息
发表于: IP:您无权察看 2015-4-29 14:57:31 | [全部帖] [楼主帖] 楼主

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 任务
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  单线程执行程序的测试

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      线程池线程执行程序的测试
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       线程池线程执行程序的测试(线程数固定)
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       守护线程生成工厂
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;
      }
}




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论