`
supben
  • 浏览: 326844 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java concurrent

    博客分类:
  • JVM
 
阅读更多
concurrent 包里主要有 Executor,Executors,ExecutorService,Callable这几个包或者接口。

Executor 执行者。在concurrent 不直接调用thread的start执行任务,而是用Excutor的 excute实现 而
Executors和Executor 的关系就相当于 Collection和Collections的关系,
后者是操作前者的工具类。至于ExecutorService是一个接口,Executors创建的线程池都实现了这个接口,实现了常用的操作方法。也就是说,一般不直接使用Executor ,而用线程池ExecutorService。

另外Callable 相当于 带返回值的 Runnable,在线程池中通过调用submit方法,会得到任务运行的结果。比如
Future<String> f = service.submit(new Call());
System.out.println(f.get());



为什么要这么运行线程,而不是直接用start方法呢?因为线程池ExecutorService提供了很多很有用的方法。比如结束任务,这个Thread是做不到的。

package com.supben.task;

public class Task implements Runnable {

	private final int i;

	public Task(int i) {
		this.i = i;
	}

	@Override
	public void run() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("第" + i + "个任务开始......");
	}

}



package com.supben.executor;

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

import com.supben.task.Task;

public class Test {

	static ExecutorService service = Executors.newFixedThreadPool(5);

	public static void shutup() {
		for (int i = 1; i < 101; i++) {
			service.execute(new Task(i));
		}
	}

	public static void shutdown() {
		service.shutdownNow();
	}

	public static void main(String[] args) {
		shutup();
		shutdown();
	}
}


执行结果是:抛出5个 sleep interrupted异常。 因为我开始了5个线程,然后再调用强行终止方法,以至于sleep 中断。。。还有个shutdown()方法,他会等待当前正在执行的全部执行完,才会关闭,shutdown后不能再向线程池添加任务。

看看Executors的3个主要方法:
newFixedThreadPool(固定大小线程池)
创建一个可重用固定线程集合的线程池,以共享的无界队列方式来运行这些线程(只有要请求的过来,就会在一个队列里等待执行)。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务(如果需要)。

newCachedThreadPool(无界线程池,可以进行自动线程回收)
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。注意,可以使用 ThreadPoolExecutor 构造方法创建具有类似属性但细节不同(例如超时参数)的线程池。

newSingleThreadExecutor(单个后台线程)
创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1) 不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。


此外java concurrent还提供了一些很有用的工具包,他们是
Semaphore                 :一个计数信号量
ReentrantLock             :一个可重入的互斥锁定 Lock,功能类似synchronized,但要强大的多。
BlockingQueue             :阻塞队列。
CompletionService         : ExecutorService的扩展,可以获得线程执行结果的
CountDownLatch            :一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CyclicBarrier             :一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics