JAVA多线程实现的三种方式 ()

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

 

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

 

在合适的地方启动线程如下:

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

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

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

为了启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例:

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

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

    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下验证过没问题可以直接使用。代码如下:

package MavenTest.maven_demo_web;
import java.util.concurrent.*;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;

/**
* 有返回值的线程
*/
public class Test {
public static void main(String[] args) throws ExecutionException,
    InterruptedException {
   System.out.println("----程序开始运行----");
   Date date1 = new Date();

   int taskSize = 5;//同时开启的线程数量
   // 创建一个线程池
   ExecutorService pool = Executors.newFixedThreadPool(taskSize);
   // 创建多个有返回值的任务
   List<Future<Object>> list = new ArrayList<Future<Object>>();
   List<MyCallable> listCallable = new ArrayList<MyCallable>();
   for (int i = 0; i <10; i++) {
     MyCallable callableTask = new MyCallable(i + " ");
    listCallable.add(callableTask);
   }
// 执行任务并获取Future对象
   list= pool.invokeAll(listCallable);
   // 关闭线程池
   pool.shutdown();

   // 获取所有并发任务的运行结果
   for (Future f : list) {
    // 从Future对象上获取任务的返回值,并输出到控制台
    System.out.println(">>>" + f.get().toString());
   }

   Date date2 = new Date();
   System.out.println("----程序结束运行----,程序运行时间【"
     + (date2.getTime() - date1.getTime()) + "毫秒】");
}
}

class MyCallable implements Callable<Object> {
private String taskNum;

MyCallable(String taskNum) {
   this.taskNum = taskNum;
}

public Object call() throws Exception {
   System.out.println(">>>" + taskNum + "任务启动");
   Date dateTmp1 = new Date();
   Thread.sleep(1000);
   Date dateTmp2 = new Date();
   long time = dateTmp2.getTime() - dateTmp1.getTime();
   System.out.println(">>>" + taskNum + "任务终止");
   return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
}
}

代码说明:
上述代码中Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
public static ExecutorService newFixedThreadPool(int nThreads)
创建固定数目线程的线程池。
public static ExecutorService newCachedThreadPool()
创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

转载于:http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html

 

转载于:https://www.cnblogs.com/zy-jiayou/p/7249858.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于主机的思维导图_送给孩子最好的思维导图课程

思维导图寒假班来了1关于思维导图思维导图是一种简单而有效的图形思维工具&#xff0c;主要元素包含图形、线条、关键字、颜色&#xff0c;配合下图&#xff0c;我们能理解思维导图利用了左脑和右脑的工作机理&#xff0c;能够充分调动大脑的分析推理和想象创新能力&#xff0c…

2016年10月计算机网络技术,2016年10月自考《计算机网络技术》练习题及答案1

2016年10月自考备考开始了&#xff0c;为了帮助自考生在考试阶段顺利复习&#xff0c;猎学网小编为你提供2016年10月自考《计算机网络技术》练习题及答案1&#xff0c;检测备考情况&#xff0c;从而进行查缺补漏。更多2016自学考试资讯请访问1、对地址转换协议(ARP)描述正确的是…

华为项目Tree canvas画图2

//添加数组找到box_content ul li 对应的indexct.lineTo($(".box_content ul li").eq(j).position().left57,($(".box_header ul li").eq(index).position().top)106140);//中点ct.lineTo($(".box_content ul li").eq(j).position().left57,($(&…

那年夏日我吃瓜

好吧&#xff0c;标题就是为了吸引读者进来增加阅读量的&#xff0c;作为一个公众号小编&#xff0c;我没有什么大量的墨水贡献给大家&#xff0c;但是就是想吹牛逼一下。我最近很懒&#xff0c;都有好几天没有更新新的文章了&#xff0c;然后大家也看到我自己写的东西没有什么…

验证python安装_Python环境搭建(安装、验证与卸载)

电脑系统版本 &#xff1a;Win8.1/64位Python官网地址&#xff1a;www.python.orgPython安装版本&#xff1a;3.7.2本文目录&#xff1a;一、Python的安装二、验证Python安装的情况三、Python的卸载四、Python环境变量配置一、Python的安装1.打开浏览器进入Python官网&#x…

未来计算机是否有意识或者人为的赋予意识,人工智能会有自我意识吗?

在西雅图的艾伦脑科学研究所&#xff0c;正在进行大规模的研究&#xff0c;以了解人脑中860亿个神经元是如何连接的。目的是产生所有连接的图&#xff1a;连接组。该研究所的科学家现在正在重建一立方毫米的老鼠大脑&#xff0c;这是有史以来最复杂的。绘制出大脑连接方式的映射…

别瞎找了,你要的C语言经典示例都在这~

大家周末好&#xff0c;这篇文章是从朋友的号那边看到的&#xff0c;确实不错&#xff0c;如果C语言还觉得没有胸有成熟的话&#xff0c;可以看看。里面的例子都很经典&#xff0c;有条件的同学实际操作一下。给大家找了一些C语言经典示例&#xff0c;github链接&#xff1a;ht…

【Java基础总结】网络编程

网络编程 InetAddress tcp udp转载于:https://www.cnblogs.com/lhat/p/6168909.html

广联达文件被锁怎么修复_事无巨细的绕过Apple id教程+修复蜂窝数据/电话

本次教程首发于Apple tech752大神&#xff0c;十分感谢他的nice job&#xff01;通过这份教程你可以绕过Apple id激活锁&#xff0c;并且保留通话和移动数据和短信的功能&#xff0c;解决了由于基带锁导致绕过ID的机器不可以打电话的问题。写在前面&#xff1a;1.请勿用于捡到/…

计算机辅助翻译专业院校,2017年北大计算机辅助翻译考研经验分享

2017年北大计算机辅助翻译考研经验分享【摘要】笔者完美地将自身优势与兴趣相结合&#xff0c;最终成功折桂北大计算机辅助翻译。►择校(兴趣优势)其实我最开始考研的目标并不是北大的计算机作者hhhhhh1111次阅读2017-07-06【摘要】笔者完美地将自身优势与兴趣相结合&#xff0…

如何写出让同事无法维护的代码?

译文&#xff1a;http://coolshell.cn/articles/4758.html原文&#xff1a;http://mindprod.com/jgloss/unmain.html文章转自公众号 strongerHuang对&#xff0c;你没看错&#xff0c;本文就是教你怎么写出让同事无法维护的代码&#xff0c;因为只有这样&#xff0c;别人才不能…

vs编译python好还是pycharm的好_Python学习 第3天 VS与PyCharm使用对比

前两天出差&#xff0c;趁着热情再玩玩Python吧IDE就在VS和Pycharm中选吧&#xff0c;这两个IDE都很喜欢一、VS能在VS中开发Python是最好&#xff0c;平时习惯了。可以安装PTVS&#xff0c;直接新建个Python项目&#xff0c;就会提示下载PTVS了&#xff0c;安装完试了下&#x…

CodeVs——T 4919 线段树练习4

http://codevs.cn/problem/4919/ 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题解查看运行结果题目描述 Description给你N个数&#xff0c;有两种操作 1&#xff1a;给区间[a,b]内的所有数都增加X 2&#xff1a;询问区间[a,b]能被7整除的个数 输入描述 Input Descri…

html tab与jQuery,使用jquery实现div的tab切换实例代码

jQuery实现Tab切换 接触jQ不久以前的js代码来写的简单效果现在用jQ来写&#xff1a;HTML代码&#xff1a;最新评论近期热评随机文章1234567890-11234567890-21234567890-3css代码&#xff1a;#sidebar-tab{border:1px solid #ccf;margin-bottom:1.5em;overflow:hidden;}#tab-ti…

调试,是一件有挑战的事情

如果你不是工程师&#xff0c;你应该享受不到加班调试的乐趣吧&#xff0c;我记得在大学的时候&#xff0c;我第一次调试I2C时序&#xff0c;当时用的芯片是24C02的RTC芯片&#xff0c;用51单片机模拟I2C时序&#xff0c;怎么整也整不出来&#xff0c;时序这个东西&#xff0c;…

make 命令_make考点总结(建议中、高考学生收藏)

考点一、“make宾语宾语补足语”结构1、这个结构表示“ 使…… 处于某种状态”“ 使……怎么样”。其中宾语的补足语&#xff0c;通常是表示情感的词(happy, sad)或者是表示状态的词(rich, strong, ill)。比如&#xff0c;Make your room clean.“使你的房间干净”&#xff0c;…

如何通俗易懂的解释PWM?

学过电力电子的小伙伴们都知道…交流电“整流”为直流电&#xff08;a&#xff09;…直流电“逆变”为交流电&#xff08;b&#xff09;…交流电“变压”为交流电&#xff08;c&#xff09;…直流电“斩波”为直流电&#xff08;d&#xff09;…“变压”&#xff08;c&#xff…

计算机与环境科学,计算机在环境科学与工程方向的应用

计算机技术与环境应用21世纪是信息时代&#xff0c;作为信息化社会标志的计算机也愈来愈广泛地为人类所掌握和利用。计算机的便捷和高效性提高着社会的生产力&#xff0c;使人们创造着前所未有的物质财富。与此同时&#xff0c;人口的快速增长、资源的过度消耗、环境污染和生态…

一个前辈总结的思考

文章是一个互联网的前辈写的&#xff0c;但是我觉得技术应该不分什么互联网不互联网&#xff0c;里面说到的一些内容&#xff0c;值得我们借鉴&#xff0c;分享给大家&#xff0c;希望大家能有一些认知上的收获&#xff0c;比较接地气&#xff0c;内容中讲到送外卖的部分也是真…

python历史波动率_历史波动率计算(旧文)

按照豆粕期权的说明&#xff0c;挂盘基准价使用的波动率是按照波动率取期货合约90天的历史波动率那么问题来了&#xff0c;如何计算波动率呢&#xff1f; 学过金融的朋友可能会觉得很容易&#xff0c;当然的确很容易。但是如果是从计算机等学科过来的朋友&#xff0c;对于波动率…