Java中继承thread类与实现Runnable接口的区别

Java中线程的创建有两种方式:

 

1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中

2.  通过实现Runnable接口,实例化Thread类

 

    在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程。当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果。

 

 

Java代码  
  1. package com.threadtest;  
  2. class MyThread extends Thread{  
  3.       
  4.     private int ticket = 10;  
  5.     private String name;  
  6.     public MyThread(String name){  
  7.         this.name =name;  
  8.     }  
  9.       
  10.     public void run(){  
  11.         for(int i =0;i<500;i++){  
  12.             if(this.ticket>0){  
  13.                 System.out.println(this.name+"卖票---->"+(this.ticket--));  
  14.             }  
  15.         }  
  16.     }  
  17. }  
  18. public class ThreadDemo {  
  19.   
  20.       
  21.     public static void main(String[] args) {  
  22.         MyThread mt1= new MyThread("一号窗口");  
  23.         MyThread mt2= new MyThread("二号窗口");  
  24.         MyThread mt3= new MyThread("三号窗口");  
  25.         mt1.start();  
  26.         mt2.start();  
  27.         mt3.start();  
  28.     }  
  29.   
  30. }  

 

 

运行结果如下:

Java代码  
  1. 一号窗口卖票---->10  
  2. 一号窗口卖票---->9  
  3. 二号窗口卖票---->10  
  4. 一号窗口卖票---->8  
  5. 一号窗口卖票---->7  
  6. 一号窗口卖票---->6  
  7. 三号窗口卖票---->10  
  8. 一号窗口卖票---->5  
  9. 一号窗口卖票---->4  
  10. 一号窗口卖票---->3  
  11. 一号窗口卖票---->2  
  12. 一号窗口卖票---->1  
  13. 二号窗口卖票---->9  
  14. 二号窗口卖票---->8  
  15. 三号窗口卖票---->9  
  16. 三号窗口卖票---->8  
  17. 三号窗口卖票---->7  
  18. 三号窗口卖票---->6  
  19. 三号窗口卖票---->5  
  20. 三号窗口卖票---->4  
  21. 三号窗口卖票---->3  
  22. 三号窗口卖票---->2  
  23. 三号窗口卖票---->1  
  24. 二号窗口卖票---->7  
  25. 二号窗口卖票---->6  
  26. 二号窗口卖票---->5  
  27. 二号窗口卖票---->4  
  28. 二号窗口卖票---->3  
  29. 二号窗口卖票---->2  
  30. 二号窗口卖票---->1  

 

通过实现Runnable接口的代码如下:
 

Java代码  
  1. package com.threadtest;  
  2. class MyThread1 implements Runnable{  
  3.     private int ticket =10;  
  4.     private String name;  
  5.     public void run(){  
  6.         for(int i =0;i<500;i++){  
  7.             if(this.ticket>0){  
  8.                 System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));  
  9.             }  
  10.         }  
  11.     }  
  12. }  
  13. public class RunnableDemo {  
  14.   
  15.       
  16.     public static void main(String[] args) {  
  17.         // TODO Auto-generated method stub  
  18.         //设计三个线程  
  19.          MyThread1 mt = new MyThread1();  
  20.          Thread t1 = new Thread(mt,"一号窗口");  
  21.          Thread t2 = new Thread(mt,"二号窗口");  
  22.          Thread t3 = new Thread(mt,"三号窗口");  
  23. //         MyThread1 mt2 = new MyThread1();  
  24. //         MyThread1 mt3 = new MyThread1();  
  25.          t1.start();  
  26.          t2.start();  
  27.          t3.start();  
  28.     }  
  29.   
  30. }  

 

运行结果如下:

Java代码  
  1. 一号窗口卖票---->10  
  2. 三号窗口卖票---->9  
  3. 三号窗口卖票---->7  
  4. 三号窗口卖票---->5  
  5. 三号窗口卖票---->4  
  6. 三号窗口卖票---->3  
  7. 三号窗口卖票---->2  
  8. 三号窗口卖票---->1  
  9. 一号窗口卖票---->8  
  10. 二号窗口卖票---->6  

 

 

    为什么会出现这种结果呐。我们不妨做个比喻,其实刚的程序,

继承Thread类的,我们相当于拿出三件事即三个卖票10张的任务分别分给三个窗口,他们各做各的事各卖各的票各完成各的任务,因为MyThread继承Thread类,所以在new MyThread的时候在创建三个对象的同时创建了三个线程;

实现Runnable的, 相当于是拿出一个卖票10张得任务给三个人去共同完成,new MyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行。

     

用图表示如下:



 

   在我们刚接触的时候可能会迷糊继承Thread类和实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。

     

    其实在实现一个任务用多个线程来做也可以用继承Thread类来实现只是比较麻烦,一般我们用实现Runnable接口来实现,简洁明了。

      

    大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。

转载于:https://www.cnblogs.com/felixzh/p/5985832.html

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

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

相关文章

【VMware vSAN 6.6】6.2.启用性能服务:vSAN硬件服务器解决方案

目录 1. 简介 1.1.适用于HCI的企业级存储2. 体系结构 2.1.带有本地存储的服务器2.2.存储控制器虚拟系统套装的缺点2.3.vSAN在vSphere Hypervisor中自带2.4.集群类型2.5.硬件部署选项3. 启用vSAN 3.1.启用vSAN3.2.轻松安装3.3.主动测试4. 可用性 4.1.对象和组件安置4.2.重新构建…

Android eclipse导入项目后出现Unable to resolve target #39;android-17#39;解决方法

eclipse导入项目后出现Unable to resolve target android-17解决方法。在最后附带还有一种编译逻辑不成功情况解决方法。 一、问题情况 二、解决的方法 1、改动项目的目标版本号与当前Android sdk相相应的版本号 2、自己主动修复一下项目 三、这个问题不是上面的。是另外情况&a…

多个圆点,鼠标选取两个,求两个点的距离,用于计算像素尺寸(halcon实现)

read_image (Image, C:/Users/22967/Desktop/晶圆找位置/0.bmp) dev_close_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image)binary_threshold (Image, Region1, max_separability, dark, UsedThreshold) connection (Region1, C…

修改UBOOT和LINUX调试串口(TI达芬奇芯片--DM6467)

Posted on 2011-10-31 10:53 jamiedu 阅读(889) 评论(0) 编辑 收藏 1.1 概述 TI针对DM6467提供的UBOOT和内核默认都是串口0作为调试串口输出的&#xff0c;但现在我需要使用DM6467的UART0的modem功能&#xff0c;所以修改代码&#xff0c;改变调试串口为串口2。 需要修改的主要…

Java List与数组之间的转换

http://blog.csdn.net/kingzone_2008/article/details/8444678转载于:https://www.cnblogs.com/longshiyVip/p/5985981.html

受欢迎的五个开源可视化工具——你的选择是?

摘要&#xff1a;大数据时代&#xff0c;数据为王&#xff0c;还在对一堆数据而发愁吗&#xff1f;试试可视化工具吧&#xff0c;相信本文提到的五款工具有一款能够帮助到你。人工智能时代&#xff0c;数据和算法以及硬件资源是非常重要的&#xff0c;相关行业的大公司也越来越…

halcon车刀崩边检测

list_files (新建文件夹, files, Files) read_image (Image, Files[0]) dev_close_window () get_image_size (Image, Width, Height) dev_open_window (0, 0, Width/1.5, Height/1.5, black, WindowHandle) dev_set_draw (margin) dev_set_colored (12) for Index:0 to |Files…

FFMPEG解码264文件步骤

本文以H264视频流为例&#xff0c;讲解解码流数据的步骤。 为突出重点&#xff0c;本文只专注于讨论解码视频流数据&#xff0c;不涉及其它&#xff08;如开发环境的配置等&#xff09;。如果您需要这方面的信息&#xff0c;请和我联系。 准备变量 定义AVCodecContext。如果…

Storm概念学习系列之storm的特性

不多说&#xff0c;直接上干货&#xff01; storm的特性 Storm 是一个开源的分布式实时计算系统&#xff0c;可以简单、可靠地处理大量的数据流。 Storm支持水平扩展&#xff0c;具有高容错性&#xff0c;保证每个消息都会得到处理&#xff0c;而且处理速度很快&#xff08;在一…

Confluence 6 配置服务器基础地址示例

2019独角兽企业重金招聘Python工程师标准>>> 如果 Confluence 的安装是没有安装在非根目录路径&#xff08;这个是上下文路径&#xff09;&#xff0c;然后服务器基础 URL 地址应该包括上下文地址。例如&#xff0c;你的 Confluence 正在运行在下面的地址&#xff1…

BootstrapValidator验证

bootstrap&#xff1a;能够增加兼容性的强大框架. 因为项目需要数据验证&#xff0c;看bootstrapValidator 还不错&#xff0c;就上手一直&#xff0c;完美兼容&#xff0c;话不多说。 需要引用css&#xff1a; bootstrap.min.css bootstrapValidator.min.css js: jquery-1.10.…

基于ARM9的视频采集传输系统

http://www.ic37.com/htm_tech/2007-11/77189_618093.htm

halcon找矩形顶点的一种方法

主程序&#xff1a; read_image (Image11, 11)*画仿射矩形 dev_set_color (green) draw_rectangle2 (3600, Row, Column, Phi, Length1, Length2)*生成仿射矩形xld gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2) *找顶点工具&#xff08;基于卡…

老男孩linux运维50期

一、自我介绍&#xff1a;我是来自老男孩Linux运维脱产50期的杨国峰&#xff0c;我以前是学软件编码的&#xff0c;但在大学里基本没怎么学&#xff0c;每一门课都一知半解的&#xff0c;甚至有些连软件都不会装&#xff0c;在校期间&#xff0c;我对JAVA、网页设计等都不感兴趣…

博客收藏

http://www.dreamfairy.cn/blog/category/unity3d/转载于:https://www.cnblogs.com/wantnon/p/5989843.html

移动开发平台性能比較

jquerymobile是一个mobile平台下的js框架,跟phonegap没有一毛钱关系.phonegap实际上在国内占有率不高的,非常多人为了体验喜欢做传统的原生手机应用. 而Webapp如今的占有率越来越少,由于越来越多的人不喜欢用手机浏览器去体验专门为移动平台搭建的站点.我认为你的比較对象应该是…

H264关于RTP协议的实现

完整的C&#xff0f;S架构的基于RTP&#xff0f;RTCP的H&#xff0e;264视频传输方案。此方案中&#xff0c;在服务器端和客户端分别进行了功能模块设计。服务器端&#xff1a;RTP封装模块主要是对H&#xff0e;264码流进行打包封装&#xff1b;RTCP分析模块负责产牛和发送RTCP…

华为数通HCIE面试题目解密系列之RSTP边缘端口

以下是华为数通面试考试的一道真题&#xff0c;原题如下&#xff1b; 请举例说明 stp 的 edge port 的作用,用在什么场景&#xff0c;并且使用 edge port 会碰到什么问题&#xff0c;怎么解决和防止&#xff1f; 提到边缘端口&#xff0c;我们是在NP课程的交换部分第一次接触&a…

VS2013 Pro版本密钥

Visual Studio Professional 2013 KEY&#xff08;密钥&#xff09;&#xff1a; XDM3T-W3T3V-MGJWK-8BFVD-GVPKY 转载于:https://www.cnblogs.com/Mysterious/p/5990358.html

Django:视图和URL配置

一、视图1.在mysite文件夹下。创建views.py文件&#xff08;文件名称没有特别的要求&#xff09;&#xff1b;from django.http import HttpResponsedef hello(request):return HttpResponse("Hello world")2.改动mysite文件夹下的urls.py文件&#xff1b;from djang…