- 浏览: 87477 次
- 性别:
- 来自: 厦门
最新评论
-
zhengyong7232:
SELECT t.province,DECODE(landsc ...
列转行 -
meepo3927:
不是特么很懂
列转行
在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。在Java5以后,通过Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特性。
一、创建任务
任务就是一个实现了Runnable接口的类。
创建的时候实run方法即可。
二、执行任务
通过java.util.concurrent.ExecutorService接口对象来执行任务,该接口对象通过工具类java.util.concurrent.Executors的静态方法来创建。
Executors此包中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。
ExecutorService提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以关闭 ExecutorService,这将导致其停止接受新任务。关闭后,执行程序将最后终止,这时没有任务在执行,也没有任务在等待执行,并且无法提交新任务。
executorService.execute(new TestRunnable());
1、创建ExecutorService
通过工具类java.util.concurrent.Executors的静态方法来创建。
Executors此包中所定义的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 类的工厂和实用方法。
比如,创建一个ExecutorService的实例,ExecutorService实际上是一个线程池的管理工具:
ExecutorService executorService = Executors.newCachedThreadPool();
ExecutorService executorService = Executors.newFixedThreadPool(3);
ExecutorService executorService = Executors.newSingleThreadExecutor();
2、将任务添加到线程去执行
当将一个任务添加到线程池中的时候,线程池会为每个任务创建一个线程,该线程会在之后的某个时刻自动执行。
三、关闭执行服务对象
executorService.shutdown();
四、综合实例
package concurrent; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by IntelliJ IDEA. * * @author */ public class TestCachedThreadPool { public static void main(String[] args) { // ExecutorService executorService = Executors.newCachedThreadPool(); ExecutorService executorService = Executors.newFixedThreadPool(5); // ExecutorService executorService = Executors.newSingleThreadExecutor(); for (int i = 0; i < 5; i++) { executorService.execute(new TestRunnable()); System.out.println("************* a" + i + " *************"); } executorService.shutdown(); } } class TestRunnable implements Runnable { public void run() { System.out.println(Thread.currentThread().getName() + "线程被调用了。"); while (true) { try { Thread.sleep(5000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } } }
运行结果:
运行结果: ************* a0 ************* ************* a1 ************* pool-1-thread-2线程被调用了。 ************* a2 ************* pool-1-thread-3线程被调用了。 pool-1-thread-1线程被调用了。 ************* a3 ************* ************* a4 ************* pool-1-thread-4线程被调用了。 pool-1-thread-5线程被调用了。 pool-1-thread-2 pool-1-thread-1 pool-1-thread-3 pool-1-thread-5 pool-1-thread-4 pool-1-thread-2 pool-1-thread-1 pool-1-thread-3 pool-1-thread-5 pool-1-thread-4 ......
public interface Callable<V>
import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; /** * Callable接口测试 * * @author leizhimin 2008-11-26 9:20:13 */ public class CallableDemo { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); List<Future<String>> resultList = new ArrayList<Future<String>>(); //创建10个任务并执行 for (int i = 0; i < 10; i++) { //使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中 Future<String> future = executorService.submit(new TaskWithResult(i)); //将任务执行结果存储到List中 resultList.add(future); } //遍历任务的结果 for (Future<String> fs : resultList) { try { System.out.println(fs.get()); //打印各个线程(任务)执行的结果 } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { //启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。 executorService.shutdown(); } } } } class TaskWithResult implements Callable<String> { private int id; public TaskWithResult(int id) { this.id = id; } /** * 任务的具体过程,一旦任务传给ExecutorService的submit方法,则该方法自动在一个线程上执行。 * * @return * @throws Exception */ public String call() throws Exception { System.out.println("call()方法被自动调用,干活!!! " + Thread.currentThread().getName()); //一个模拟耗时的操作 for (int i = 999999; i > 0; i--) ; return "call()方法被自动调用,任务的结果是:" + id + " " + Thread.currentThread().getName(); } }
call()方法被自动调用,干活!!! pool-1-thread-1 call()方法被自动调用,干活!!! pool-1-thread-3 call()方法被自动调用,干活!!! pool-1-thread-4 call()方法被自动调用,干活!!! pool-1-thread-6 call()方法被自动调用,干活!!! pool-1-thread-2 call()方法被自动调用,干活!!! pool-1-thread-5 call()方法被自动调用,任务的结果是:0 pool-1-thread-1 call()方法被自动调用,任务的结果是:1 pool-1-thread-2 call()方法被自动调用,干活!!! pool-1-thread-2 call()方法被自动调用,干活!!! pool-1-thread-6 call()方法被自动调用,干活!!! pool-1-thread-4 call()方法被自动调用,任务的结果是:2 pool-1-thread-3 call()方法被自动调用,干活!!! pool-1-thread-3 call()方法被自动调用,任务的结果是:3 pool-1-thread-4 call()方法被自动调用,任务的结果是:4 pool-1-thread-5 call()方法被自动调用,任务的结果是:5 pool-1-thread-6 call()方法被自动调用,任务的结果是:6 pool-1-thread-2 call()方法被自动调用,任务的结果是:7 pool-1-thread-6 call()方法被自动调用,任务的结果是:8 pool-1-thread-4 call()方法被自动调用,任务的结果是:9 pool-1-thread-3 Process finished with exit code 0
发表评论
-
最小生成树之Kruskal算法
2013-12-15 00:54 1061这篇文章实现最小生成树的Kruskal算法Kruskal算 ... -
排序算法--插入排序
2013-12-15 00:47 1035插入排序原理:假设 ... -
poi创建下拉框
2013-04-16 19:01 0package finance.tools.salesper ... -
Spring中Transactional配置
2013-04-11 20:43 973Spring中Transactional配置 标签: 杂谈 分 ... -
Hibernate将Enum枚举类型映射为Int类型 .
2013-04-09 16:46 1502最近要用Hibernate做一个枚举类型的映射,在MySQL ... -
Hibernate 更灵活的用法 HibernateCallback
2013-01-22 14:41 1386在项目中用Hibernate的DetachedCriter ... -
spring源代码分析(2)--BeanFactory
2013-01-20 12:38 1385我们首先来看下BeanFacroty接口 pa ... -
spring源代码分析(1)--Resource的分析
2013-01-20 12:22 4004我们知道,在spring中,配置文件是通过资源形式加载的, ... -
DefaultListableBeanFactory研究
2013-01-18 10:49 5874DefaultSingletonBeanRegistry完 ... -
jvm的内存调优
2013-01-11 15:54 8291) 堆 运行时数 ... -
struts2中Action的name 和package的name和namespace是什么作用
2013-01-02 12:16 9598在struts2的 struts.xml 配置中 例: ... -
深入探索 高效的Java异常处理框架
2012-10-22 14:09 875摘要:本文从Java异常最基本的概念、语法开始讲述了Java异 ... -
JAVA对ArrayList排序
2012-10-16 21:53 16483java如何对ArrayList中对象按照该对象某属性排序 ... -
ThreadPoolExecutor使用和思考(中)-keepAliveTime及拒绝策略
2012-09-11 00:48 929工作中多处接触到了ThreadPoolExecutor。趁着现 ... -
ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别
2012-09-11 00:45 1616工作中多处接触到了ThreadPoolExecutor。趁着现 ... -
Spring IOC之BeanFactory
2012-09-10 12:39 1281BeanFactory ,作为 Spring 基础的 IoC ... -
Spring对事务管理的支持的发展历程(基础篇
2012-08-31 17:43 912Connection conn = DataS ... -
CXF ,在Client端用于把 Date 类型转换成 XMLGregorianCalendar .
2012-08-31 16:54 1620import javax.xml.datatype.Datat ... -
《Spring技术内幕》学习笔记10——Web环境中Spring的启动过程
2012-07-30 09:04 9801.Spring 不但可以在 JavaSE 环境中应用,在 W ... -
spring 加载bean过程源码简易解剖
2012-07-30 08:45 1173这一篇主要是讲用载入bean的过程。其实就是IOC.低调 低调 ...
相关推荐
13-Java并发编程学习宝典.zip
java并发学习总结 例子:包含(并发容器、同步容器、同步工具、死锁、异常、中断、线程池、返回结果、同步方法等代码例子)
Java并发编程学习笔记.
Java并发编程学习笔记
Java并发体系学习思维笔记.rar
一本适合初级、中级Java开发人员的书,对Java并发编程详细描述,是学习Java并发编程技术的很好的书籍。
JAVA多线程与并发学习总结.pdf
目前,在Java并发编程方面论述系统、内容详实的中文资料很少。本文是作者在实际工作中经验总结,部分内容来自《Java Concurrency In Practice》。涵盖了Java并发编程所需掌握的大部分知识,且实例丰富通俗易懂。读完...
Java 并发.pdf_电子版pdf版
《Java 7并发编程实战手册》适合具有一定Java编程基础的读者阅读和学习。如果你是一名Java开发人员,并且想进一步掌握并发编程和多线程技术,并挖掘Java 7并发的新特性,那么本书是你的合适之选。 《Java 7并发编程...
Java并发讲义,java并发编程,只讲在开发过程中遇到的并发是如何处理的,是阿里的培训材料,值得学习与收藏。
java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记
Java并发学习资料
实战java高并发程序设计,学习java并发编程的一手资料,值得一看。在过去单核CPU时代,单任务在一个时间点只能执行单一程序,随着多核CPU的发展,并行程序开发就显得尤为重要。, 《实战Java高并发程序设计》主要介绍...
java并发编程学习笔记,很详细的资料
对于从事java开发的人员来说,并发是一个很重要的不可避免要处理的问题,这个书也是公认的学习并发的必读物。
Java并发编程与高并发解决方案-学习笔记
java并发库学习笔记
该书通过对常见的并发场景进行分析,通过场景+实践的模式使得对并发的学习更加的容易上手,清晰易懂