使用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