使用线程执行者执行任务

初学线程的java程序员在学习线程的时候,如果是想使用多线程,要么是继承Thread类,要么是实现runnable接口再提交给一个新创建的Thread。

下面介绍一下使用ThreadPoolExecutor线程执行者来运行多线程任务。它将线程创建与任务运行分离开来。

package test;

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

public class ThreadExecuteExample {
	public static void main(String[] args) {
		ExecutorService  service = Executors.newFixedThreadPool(2);
		for (int i = 0; i < 10; i++) {
			service.execute(new Runnable() {

				@Override
				public void run() {
					try {
						Thread.sleep(1 * 1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
		}
		service.shutdown();
		try {
			service.awaitTermination(Integer.MAX_VALUE, TimeUnit.DAYS);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
ExecutorService  service = Executors.newFixedThreadPool(2);

通过Executors创建了一个拥有两个线程的ExecutorService对象。

for (int i = 0; i < 10; i++) {
			service.execute(new Runnable() {

				@Override
				public void run() {
					try {
						Thread.sleep(1 * 1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
		}

往ExecutorService中提交了10个runnable对象的实例。ExecutorService会使用内部的2个线程来逐个运行这10个runnable对象。

service.shutdown();

关闭执行者。因为ExecutorService利用了它内部的初始化好的线程去执行提交的多个runnable任务,所以这些线程被反复利用而不会消亡。如果不显示的调用shutdown()方法的话,ExecutorService内部的线程一直会存活下去,这样即使任务完成了,虚拟机也不会退出。调用shutdown()后就会通知ExecutorService运行完任务后销毁所有的线程。

shutdown是一个非阻塞的方法。

service.awaitTermination(Integer.MAX_VALUE, TimeUnit.DAYS);

在指定的时间内阻塞等待ExecutorService任务的完成。

时间: 2024-11-05 18:51:59

使用线程执行者执行任务的相关文章

Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)

周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博客,就代码论事,因此了解到一些 Qt 深层的实现,虽然是在 Qt 庞大的构架里只算的是冰山的一角,确让人颇为收益. 从 dbzhang800 的博客中转载两篇关于事件循环的文章,放在一起,写作备忘. 再次提到的一点是:事件循环和线程没有必然关系. QThread 的 run() 方法始终是在一个单独

delphi.thread.线程循环执行体结构

线程话题太大,又都是些坑,不知从哪方面讲起,所以,想一出是一出了. 不管怎样,我们从开始使用D,不管有没有用线程,其实它已经帮我们做了一个最完整的线程执行处理:Application.Run. 这行App.Run,在dpr,想来各位都经常能够看到,如果跟踪下去,我们就会发现,它其实就是一个最完整的线程执行体的结构了: 我将里面一些代码删除掉了,再将HandleMessage的代码复制过来,然后,代码如下: procedure TApplication.Run; var Msg: TMsg; be

两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的?

3.两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的? void foo(){    ++a;    printf("%d ",a);}A.3 2    B.2 3    C.3 3    D.2 2  1.读a            5.读a2.a+1            6.a+13.写a            7.写a4.打印a          8.打印a B:12345678C:12356784(或48)D:15234678

Java中线程顺序执行

现有线程threadone.threadtwo和threadthree,想要的运行顺序为threadone->threadtwo->threadthree,应该如何处理?这里需要用到一个简单的线程方法join(). join()方法的说明:join方法挂起当前调用线程,直到被调用线程完成后在继续执行(join() method suspends the execution of the calling thread until the object called finishes its ex

Java多线程之后台线程不执行finally

后台线程不执行finally package wzh.daemon; import java.util.concurrent.TimeUnit; class ADaemon implements Runnable { @Override public void run() { try { System.out.println("Starting ADaemon"); TimeUnit.SECONDS.sleep(1); } catch (Exception e) { System.ou

java中等待所有线程都执行结束

转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原文如下http://software.intel.com/zh-cn/blogs/2013/10/15/java-countdownlatchcyclicbarrier/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&a

Concurrent包总结——线程任务执行框架

一 Executor接口 Executor接口的对象是一种执行任务的方式.它能够使提交的任务和执行任务的线程的管理解耦.我们通常用Executor来代替new一个Thread对象来执行任务.这样可以省略底层线程的管理细节. 例如: executor.excute(new RunnableTask()); concurrent包中提供了比较常用的Executor的实现,这些实现类都实现了一个更加灵活的类ExecutorService.而ThreadPoolExecutor则提供了一个可扩展的线程池

在指定的CEF线程上执行任务

CEF有几种线程,比如TID_UI.比如TID_RENDER,每种都有特定的含义,具体类别定义在cef_types.h中,摘录如下: typedef enum { // BROWSER PROCESS THREADS -- Only available in the browser process. /// // The main thread in the browser. This will be the same as the main // application thread if C

Task线程 同时执行多个任务

Task taskTest = Task.Factory.StartNew(() => { Console.WriteLine("1231231332"); },TaskCreationOptions.None); Task taskTwo = Task.Factory.StartNew(() => { Console.WriteLine("252525"); }, TaskCreationOptions.None); Console.WriteLine