Java执行程序服务类型

ExecutorService功能是Java 5附带的。它扩展了Executor接口,并提供了线程池功能来执行异步简短任务。

使用Java 6提供的ExecutorService接口有五种异步执行任务的方法。

ExecutorService execService = Executors.newCachedThreadPool();

这种方法的方法将创建一个线程池,该线程池会根据需要创建新线程,但是在可用之前会重用以前构造的线程。 这些池通常将提高执行许多短期异步任务的程序的性能。 如果没有可用的现有线程,则将创建一个新线程并将其添加到池中。 60秒钟未使用的线程将终止并从缓存中删除。

ExecutorService execService = Executors.newFixedThreadPool(10);

这种方法的方法创建了一个线程池,该线程池可重用固定数量的线程。 创建的nThreads将在运行时处于活动状态。 如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到某个线程可用为止。

ExecutorService execService = Executors.newSingleThreadExecutor();

这种方法的方法将创建一个执行器,该执行器使用在无限制队列上运行的单个工作线程。 确保任务按顺序执行,并且在任何给定时间都不会激活一项以上的任务。

ExecutorService的方法:

execute(Runnable):在将来的某个时间执行给定命令。

Submit(Runnable): Submit方法返回一个表示执行任务的Future对象。 如果任务正确完成,则Future Object返回null。

shutdown():启动有序关闭,在该关闭中执行先前提交的任务,但不接受任何新任务。 如果已关闭,则调用不会产生任何其他影响。

shutdownNow():尝试停止所有正在执行的任务,暂停正在等待的任务的处理,并返回正在等待执行的任务的列表。
除了尽最大努力尝试停止处理正在执行的任务之外,没有任何保证。 例如,典型的实现将通过Thread.interrupt取消,因此任何无法响应中断的任务都可能永远不会终止。

下面是一个示例应用程序:

步骤1:建立已完成的专案

创建一个Maven项目,如下所示。 (可以使用Maven或IDE插件来创建它)。

第2步:创建新任务

通过实现如下所示的Runnable接口(创建线程)来创建新任务。 TestTask类指定将要执行的业务逻辑。

package com.otv.task;

import org.apache.log4j.Logger;

/**
 * @author onlinetechvision.com
 * @since 24 Sept 2011
 * @version 1.0.0
 *
 */
public class TestTask implements Runnable {
 private static Logger log = Logger.getLogger(TestTask.class);
 private String taskName;

 public TestTask(String taskName) {
  this.taskName = taskName;
 }

 public void run() {
  try {
   log.debug(this.taskName + " is sleeping...");
   Thread.sleep(3000);
   log.debug(this.taskName + " is running...");
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }

 public String getTaskName() {
  return taskName;
 }

 public void setTaskName(String taskName) {
  this.taskName = taskName;
 }

}

步骤3:使用newCachedThreadPool创建TestExecutorService

通过使用方法newCachedThreadPool创建TestExecutorService。 在这种情况下,将在运行时指定创建的线程数。

package com.otv;

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

import com.otv.task.TestTask;

/**
 * @author onlinetechvision.com
 * @since 24 Sept 2011
 * @version 1.0.0
 *
 */
public class TestExecutorService {

 public static void main(String[] args) {
  ExecutorService execService = Executors.newCachedThreadPool();
  execService.execute(new TestTask("FirstTestTask"));
  execService.execute(new TestTask("SecondTestTask"));
  execService.execute(new TestTask("ThirdTestTask"));

  execService.shutdown();
 }
}

运行TestExecutorService时,输出将如下所示:

24.09.2011 17:30:47 DEBUG (TestTask.java:21) - SecondTestTask is sleeping...
24.09.2011 17:30:47 DEBUG (TestTask.java:21) - ThirdTestTask is sleeping...
24.09.2011 17:30:47 DEBUG (TestTask.java:21) - FirstTestTask is sleeping...
24.09.2011 17:30:50 DEBUG (TestTask.java:23) - ThirdTestTask is running...
24.09.2011 17:30:50 DEBUG (TestTask.java:23) - FirstTestTask is running...
24.09.2011 17:30:50 DEBUG (TestTask.java:23) - SecondTestTask is running...

步骤4:使用newFixedThreadPool创建TestExecutorService

通过使用方法newFixedThreadPool创建TestExecutorService。 在这种情况下,将在运行时指定创建的线程数。

package com.otv;

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

import com.otv.task.TestTask;

/**
 * @author onlinetechvision.com
 * @since 24 Sept 2011
 * @version 1.0.0
 *
 */
public class TestExecutorService {

 public static void main(String[] args) {
  ExecutorService execService = Executors.newFixedThreadPool(2);
  execService.execute(new TestTask("FirstTestTask"));
  execService.execute(new TestTask("SecondTestTask"));
  execService.execute(new TestTask("ThirdTestTask"));

  execService.shutdown();
 }
}

运行TestExecutorService时,在完成FirstTestTask和SecondTestTask的执行之后,将执行ThirdTestTask。 输出将被视为
下面:

24.09.2011 17:33:38 DEBUG (TestTask.java:21) - FirstTestTask is sleeping...
24.09.2011 17:33:38 DEBUG (TestTask.java:21) - SecondTestTask is sleeping...
24.09.2011 17:33:41 DEBUG (TestTask.java:23) - FirstTestTask is running...
24.09.2011 17:33:41 DEBUG (TestTask.java:23) - SecondTestTask is running...
24.09.2011 17:33:41 DEBUG (TestTask.java:21) - ThirdTestTask is sleeping...
24.09.2011 17:33:44 DEBUG (TestTask.java:23) - ThirdTestTask is running...

步骤5:使用newSingleThreadExecutor创建TestExecutorService

通过使用方法newSingleThreadExecutor创建TestExecutorService。 在这种情况下,仅创建一个线程,并按顺序执行任务。

package com.otv;

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

import com.otv.task.TestTask;

/**
 * @author onlinetechvision.com
 * @since 24 Sept 2011
 * @version 1.0.0
 *
 */
public class TestExecutorService {

 public static void main(String[] args) {
  ExecutorService execService = Executors.newSingleThreadExecutor();
  execService.execute(new TestTask("FirstTestTask"));
  execService.execute(new TestTask("SecondTestTask"));
  execService.execute(new TestTask("ThirdTestTask"));

  execService.shutdown();
 }
}

当运行TestExecutorService时,FirstTestTask的执行完成后,将执行SecondTestTask和ThirdTestTask。 输出将如下所示:

24.09.2011 17:38:21 DEBUG (TestTask.java:21) - FirstTestTask is sleeping...
24.09.2011 17:38:24 DEBUG (TestTask.java:23) - FirstTestTask is running...
24.09.2011 17:38:24 DEBUG (TestTask.java:21) - SecondTestTask is sleeping...
24.09.2011 17:38:27 DEBUG (TestTask.java:23) - SecondTestTask is running...
24.09.2011 17:38:27 DEBUG (TestTask.java:21) - ThirdTestTask is sleeping...
24.09.2011 17:38:30 DEBUG (TestTask.java:23) - ThirdTestTask is running...

步骤6:参考资料

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html
http://tutorials.jenkov.com/java-util-concurrent/executorservice.html

参考: Online Technology Vision博客中来自我们JCG合作伙伴 Eren Avsarogullari的Java Executor服务类型


翻译自: https://www.javacodegeeks.com/2012/08/java-executor-service-types.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值