Java并发学习笔记(2)在java中实现多线程的启动
来源:互联网 发布:当女程序员遇到问题时 编辑:程序博客网 时间:2024/06/04 20:03
(1)直接继承Thread类
直接继承Thread类并且覆盖重写run方法,然后new出此类使用start方法启动线程如下:
public classMyThread extends Thread { @Override public void run() { while(true) { System.out.println("MyThread run()method"); } } public static class Test{ publicstatic void main(String[] args) { MyThreadt=new MyThread(); t.start(); } }}
(2)实现Runnable接口
继承Thread的坏处显而易见继承Thread后不可以继承其他类,因为Java是单继承模式的.让我们看下Thread类的run方法原型原型如下:
publicvoid run() { if (target != null) { target.run(); } }
可以看到run方法调用的是target这个对象的方法,target的定义为private Runnable targetThread类的构造参数接受Runable所以可以使用Runable接口初始化Thread类启用strat方法启动线程实例如下:
class MyR implements Runnable{ @Override public void run() { System.out.println("MyRrun method"); } }public classMyThread { public static voidmain(String[] args) { Thread t=new Thread(new MyR()); t.start(); }}
使用线程池启动一个任务
(1)使用Executors中的工厂方法可以创建一个线程池:
newFixedThreadPool:创建一个定长的线程池,每当提交一个任务就创建一个线程,知道达到池的最大长度,这时线程池会保持长度不再变化
newCachedThreadPool:创建一个可缓存的线程池,如果当前线程池的长度超过了处理的需要时,它可以灵活地回收线程,所以此线程池的长度没有限制.
newSingleThreadPool:创建一个单线程化的executor,它只创建唯一的工作线程来执行任务,如果这个线程异常结束,会有另一个取代它,executor会保证任务依照任务队列所规定的顺序(FIFO,LIFO,优先级)执行.
newScheduledThreadPool定长的线程池,而且至支持定时的以及周期性的任务执行.
i. ScheduledThreadPool在java5中已经取缔了Timer.配合DelayQueue可以实现各种延时,定时任务.
1. DelayQueue中的对象都实现了Delayed接口此接口只有一个方法getDelay(TimeUnit)方法.此方法返回延迟还有多少时间DelayQueue只会将此方法返回值 为0或 者小于0的对象取出.如果没有小于等于0的将会阻塞.
(2)以上方法返回一个ExecutoServicer对象,ExecutorService扩展了Executor.下面介绍下ExecutorService
a) ExecutorService有3个状态:
i. 运行.创建后的状态是运行.
ii. 关闭.调用shutdown方法后ExecutorService将停止接受新提交的任务,同时等待已经提交的任务完成.
iii. 终止.一旦所有任务完成就会进入终止状态.
isTerminated可以检测关闭后是否所有任务都完成.
b) awaitTermination请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行。
(3)Executor使用Runnable作为其任务的基本表达形式.Runnable不能返回一个值,或者抛出受检查的异常.很多任务是需要返回值的.比如数据库查询.这是就需要Callable接口它的call方法允许返回结果.FutureTask可以包装一个Runnable或者Callable然后使用Executor执行任务.也可以使用Submit提交Callable或者Runnable会返回一个Future对象.FutureTask对象执行一次将保存call返回的结果.第二次使用get方法返回和第一次无异.没有执行结束的FutureTask执行其get方法会阻塞.
(4)CompletionService:Executor+BlockingQueue
a) CompetionService的实现方法是ExecutorCompetionService,它的构造方法接受一个BlockingQueue<Future>参数或者使用submit提交任务,使用poll/take方法返回 一个已经完成任务的Future
(5)ExecutorService:invokeAll
a) List<Future> invokeAll(Collection<? extends Callable<T>>tasks, long timeout, TimeUnitunit)
b) 执行给定的任务,当所有任务完成或超时期满时(无论哪个首先发生),返回保持任务状态和结果的 Future 列表。
- Java并发学习笔记(2)在java中实现多线程的启动
- Java并发多线程学习笔记
- 黑马程序员学习笔记 Java中多线程与并发的总结
- 学习Java多线程与并发编程后的笔记
- java并发多线程,线程的创建启动
- Java中实现多线程并发的几种安全机制
- Java实现多线程并发
- java 多线程 并发学习
- 在Java中实现多线程
- JAVA并发的学习笔记
- (java多线程并发)concurrent包的实现
- Java开发学习笔记:Java实现多线程的方法
- java中多线程并发的处理方式
- 关于Java多线程和并发运行的学习(一)
- 关于Java多线程和并发运行的学习(二)
- 关于Java多线程和并发运行的学习(三)
- Java并发学习笔记
- java并发学习笔记
- mysql 删除分区表
- BitmapFactory.decodeFile
- 自写计算器
- position-fixed在jsp里面不支持的解决。。。
- 开发一个在Razor mvc下的插件(model/view)
- Java并发学习笔记(2)在java中实现多线程的启动
- SpatiaLite空间索引(一)
- ubuntu下最优秀的截屏软件scrot
- js计算器
- ubuntu更新管理器打不开
- Java笔试题:Java基础概念
- 11g R2 rac 启动时报错ora-17503的解决方法
- 统计字符串中出现最多次数的字母
- JDK动态代理