Java 并发编程深入学习(一)——实现多线程的方式
2016-08-30 12:51
956 查看
介绍
Java 并发编程的好处在于以下几点:1.资源利用率更好
2. 简化程序设计
3. 程序响应更快
实现方式
继承Thread类
class MyThread extends Thread{ private int ticket = 5; public void run(){ for (int i=0;i<10;i++) { if(ticket > 0){ System.out.println("ticket = " + ticket--); } } } } public class ThreadDemo{ public static void main(String[] args){ new MyThread().start(); new MyThread().start(); new MyThread().start(); } }
实现Runnable接口
Java 5以前实现多线程有两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。实现Runnable接口相比继承Thread类有如下优势:
可以避免由于Java的单继承特性而带来的局限 增强程序的健壮性,代码能够被多个程序共享,代码与数据是独立的 适合多个相同程序代码的线程区处理同一资源的情况
实现Callable接口
Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的call方法可以在线程执行结束时产生一个返回值。使用Callable+Future获取执行结果
public class CallableDemo implements Callable<Integer> { private int sum; @Override public Integer call() throws Exception { System.out.println("Callable子线程开始计算啦!"); Thread.sleep(2000); for(int i=0 ;i<5000;i++){ sum=sum+i; } System.out.println("Callable子线程计算结束!"); return sum; } }
Callable执行测试类如下:
public class CallableTest { public static void main(String[] args) { //创建线程池 ExecutorService es = Executors.newSingleThreadExecutor(); //创建Callable对象任务 CallableDemo calTask=new CallableDemo(); //提交任务并获取执行结果 Future<Integer> future =es.submit(calTask); //关闭线程池 es.shutdown(); try { Thread.sleep(2000); System.out.println("主线程在执行其他任务"); if(future.get()!=null){ //输出获取到的结果 System.out.println("future.get()-->"+future.get()); }else{ //输出获取到的结果 System.out.println("future.get()未获取到结果"); } } catch (Exception e) { e.printStackTrace(); } System.out.println("主线程在执行完成"); } }
执行结果:
Callable子线程开始计算啦! 主线程在执行其他任务 Callable子线程计算结束! future.get()-->12497500 主线程在执行完成
使用Callable+FutureTask获取执行结果
public class CallableTest { public static void main(String[] args) { // //创建线程池 // ExecutorService es = Executors.newSingleThreadExecutor(); // //创建Callable对象任务 // CallableDemo calTask=new CallableDemo(); // //提交任务并获取执行结果 // Future<Integer> future =es.submit(calTask); // //关闭线程池 // es.shutdown(); //创建线程池 ExecutorService es = Executors.newSingleThreadExecutor(); //创建Callable对象任务 CallableDemo calTask=new CallableDemo(); //创建FutureTask FutureTask<Integer> futureTask=new FutureTask<>(calTask); //执行任务 es.submit(futureTask); //关闭线程池 es.shutdown(); try { Thread.sleep(2000); System.out.println("主线程在执行其他任务"); if(futureTask.get()!=null){ //输出获取到的结果 System.out.println("futureTask.get()-->"+futureTask.get()); }else{ //输出获取到的结果 System.out.println("futureTask.get()未获取到结果"); } } catch (Exception e) { e.printStackTrace(); } System.out.println("主线程在执行完成"); } }
执行结果:
Callable子线程开始计算啦! 主线程在执行其他任务 Callable子线程计算结束! futureTask.get()-->12497500 主线程在执行完成
相关文章推荐
- 深入学习java并发编程:ThreadLocal<T>实现
- 深入学习java并发编程:线程池ThreadPoolExecutor实现以及使用
- 多线程学习之深入理解Java多线程与并发编程
- 深入学习Java多线程——并发机制底层实现原理
- Java 并发编程深入学习——线程池及其实现原理
- 深入学习java并发编程:CopyOnWriteArrayList<E>实现
- Java高并发编程——多线程的实现方式(1)
- 深入学习java并发编程:Lock与AbstractQueuedSynchronizer(AQS)实现
- Java并发编程基础---(14)实现多线程的3种方式
- [深入学习C#]C#实现多线程的方式:Task——任务
- 一步步学习java并发编程模式之Active Object模式(二)java实现异步调用
- [深入学习C#]C#实现多线程的方式:使用Parallel类
- java 多线程编程三种实现方式
- Java多线程和并发编程实践的学习心得----基础篇3
- 一步步学习java并发编程模式之Active Object模式(四)改进后的java实现
- 【Java并发编程】之六:Runnable和Thread实现多线程的区别(含代码)
- Java多线程和并发编程实践的学习心得----基础篇2
- java并发编程学习: 阻塞队列 使用 及 实现原理
- Android(java)学习笔记75:匿名内部类的方式实现多线程程序
- Java多线程(五)之BlockingQueue深入分析及其实现类实现方式分析