知识大全 Java5 并发线程学习
Posted 知
篇首语:水滴集多成大海,读书集多成学问。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java5 并发线程学习相关的知识,希望对你有一定的参考价值。
Java5 并发线程学习 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在Java 之后 并发线程这块发生了根本的变化 最重要的莫过于新的启动 调度 管理线程的一大堆API了 在Java 以后 通过Executor来启动线程比用Thread的start()更好 在新特征中 可以很容易控制线程的启动 执行和关闭过程 还可以很容易使用线程池的特性
一 创建任务
任务就是一个实现了Runnable接口的类
创建的时候实run方法即可
二 执行任务
通过ncurrent ExecutorService接口对象来执行任务 该接口对象通过工具类ncurrent Executors的静态方法来创建
Executors此包中所定义的 Executor ExecutorService ScheduledExecutorService ThreadFactory 和 Callable 类的工厂和实用方法
ExecutorService提供了管理终止的方法 以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法 可以关闭 ExecutorService 这将导致其停止接受新任务 关闭后 执行程序将最后终止 这时没有任务在执行 也没有任务在等待执行 并且无法提交新任务
executorService execute(new TestRunnable())
创建ExecutorService
通过工具类ncurrent Executors的静态方法来创建
Executors此包中所定义的 Executor ExecutorService ScheduledExecutorService ThreadFactory 和 Callable 类的工厂和实用方法
比如 创建一个ExecutorService的实例 ExecutorService实际上是一个线程池的管理工具
ExecutorService executorService = Executors newCachedThreadPool()
ExecutorService executorService = Executors newFixedThreadPool( )
ExecutorService executorService = Executors newSingleThreadExecutor()
将任务添加到线程去执行
当将一个任务添加到线程池中的时候 线程池会为每个任务创建一个线程 该线程会在之后的某个时刻自动执行
三 关闭执行服务对象
executorService shutdown()
四 综合实例
package concurrent; import ncurrent ExecutorService; import ncurrent Executors; /** * Created by IntelliJ IDEA * * @author leizhimin : : */ public class TestCachedThreadPool public static void main(String[] args) // ExecutorService executorService = Executors newCachedThreadPool(); ExecutorService executorService = Executors newFixedThreadPool( ); // ExecutorService executorService = Executors newSingleThreadExecutor(); for (int i = ; i < ; 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( ); System out println(Thread currentThread() getName()); catch (InterruptedException e) e printStackTrace();
运行结果
************* a ************* ************* a ************* pool thread 线程被调用了 ************* a ************* pool thread 线程被调用了 pool thread 线程被调用了 ************* a ************* ************* a ************* pool thread 线程被调用了 pool thread 线程被调用了 pool thread pool thread pool thread pool thread pool thread pool thread pool thread pool thread pool thread pool thread
五 获取任务的执行的返回值
在Java 之后 任务分两类 一类是实现了Runnable接口的类 一类是实现了Callable接口的类 两者都可以被ExecutorService执行 但是Runnable任务没有返回值 而Callable任务有返回值 并且Callable的call()方法只能通过ExecutorService的submit(Callable<T> task) 方法来执行 并且返回一个 <T> Future<T> 是表示任务等待完成的 Future
public interface Callable<V>返回结果并且可能抛出异常的任务 实现者定义了一个不带任何参数的叫做 call 的方法
Callable 接口类似于 Runnable 两者都是为那些其实例可能被另一个线程执行的类设计的 但是 Runnable 不会返回结果 并且无法抛出经过检查的异常
Executors 类包含一些从其他普通形式转换成 Callable 类的实用方法
Callable中的call()方法类似Runnable的run()方法 就是前者有返回值 后者没有
当将一个Callable的对象传递给ExecutorService的submit方法 则该call方法自动在一个线程上执行 并且会返回执行结果Future对象
同样 将Runnable的对象传递给ExecutorService的submit方法 则该run方法自动在一个线程上执行 并且会返回执行结果Future对象 但是在该Future对象上调用get方法 将返回null
遗憾的是 在Java API文档中 这块介绍的很糊涂 估计是翻译人员还没搞清楚的缘故吧 或者说是注释不到位 下面看个例子
import java util ArrayList; import java util List; import ncurrent *; /** * Callable接口测试 * * @author leizhimin : : */ public class CallableDemo public static void main(String[] args) ExecutorService executorService = Executors newCachedThreadPool(); List<Future<String>> resultList = new ArrayList<Future<String>>(); //创建 个任务并执行 for (int i = ; i < ; 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 = ; i > ; i ) ; return call()方法被自动调用 任务的结果是 + id + + Thread currentThread() getName();
运行结果
cha138/Article/program/Java/gj/201311/27417相关参考
知识大全 关于JAVA多线程并发synchronized的测试与合理使用
关于JAVA多线程并发synchronized的测试与合理使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
JAVA多线程学习初步经典实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! importjav
使用Java5特性来简化反射编程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!//Nextdoal
Java学习:线程池的简单构建 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 现在服务器端的应用
.NET组件中的线程辅助的学习 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Understa
C#多线程学习—生产者和消费者(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
C#多线程学习—生产者和消费者(3) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
C#多线程学习—生产者和消费者(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
知识大全 Java5泛型 T.class的获取和为擦拭法站台
Java5泛型T.class的获取和为擦拭法站台 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
线程是什么?进程是什么?二者有什么区别和联系进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:线程的划分尺度小于进程,使得多线程程序的