JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。

1、继承Thread类实现多线程
继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:

[java] view plain copy

  • public class MyThread extends Thread {
  •   public void run() {
  •    System.out.println("MyThread.run()");
  •   }
  • }

在合适的地方启动线程如下:
[java] view plain copy

  • MyThread myThread1 = new MyThread();
  • MyThread myThread2 = new MyThread();
  • myThread1.start();
  • myThread2.start();

2、实现Runnable接口方式实现多线程
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
[java] view plain copy

  • public class MyThread extends OtherClass implements Runnable {
  •   public void run() {
  •    System.out.println("MyThread.run()");
  •   }
  • }

为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:
[java] view plain copy

  • MyThread myThread = new MyThread();
  • Thread thread = new Thread(myThread);
  • thread.start();

事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:
[java] view plain copy

  • public void run() {
  •   if (target != null) {
  •    target.run();
  •   }
  • }

3、使用ExecutorService、Callable、Future实现有返回结果的多线程
ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问http://www.javaeye.com/topic/366591 ,这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回值而大费周折了,而且即便实现了也可能漏洞百出。
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5下验证过没问题可以直接使用

最新文章

  1. How to install OpenBazaar Server in CentOS7
  2. 用PHP调用Oracle存储过程方法
  3. 开发 web 桌面类程序几个必须关注的细节
  4. 1,字符是否为空,2,比较两个字符大小。String.Compare(String, String)。string.IsNullOrEmpty(string)
  5. P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1
  6. 【POJ2136】Vertical Histogram(简单模拟)
  7. MYSQL定时创建表分区
  8. HDU 4436 str2int(后缀自动机)
  9. 嵌入式C开发人员的最好的0x10道笔试题
  10. DEBUG 调试
  11. less基础语法
  12. 谷歌开发者:看可口可乐公司是怎么玩转TensorFlow的?
  13. Vue(小案例_vue+axios仿手机app)_购物车
  14. HDU 5115 (杀狼,区间DP)
  15. HTML实现包含公共部分:通过ECMA6的模块化,纯前端实现类似jsp:include的功能
  16. Python并发复习2 - 多线程模块threading
  17. ORACLE_11G归档空间满,由于数据库装完后使用的是默认空间是闪回区
  18. Spark 准备篇-环境搭建
  19. MySQL的sql_mode模式说明及设置
  20. 7z文件格式及其源码linux/windows编译

热门文章

  1. QT实现FTP服务器(三)
  2. redis09---redis 服务器端命令
  3. SQL JOIN连接分类[转]
  4. access函数的使用检查文件的权限【学习笔记】
  5. YTU 2417: C语言习题 字符串长度
  6. js实现域名判断后跳转到指定网址
  7. 接口_简单get接口_第一个接口
  8. C#方法参数总结
  9. js 购物车中,多件商品数量加减效果修改,实现总价随数量加减改变
  10. BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序