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

本文涉及的产品
语种识别,语种识别 100万字符
图片翻译,图片翻译 100张
文档翻译,文档翻译 1千页
简介: Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中2.  通过实现Runnable接口,实例化Thread类     在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程。

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)创建子类。

目录
打赏
0
0
0
0
1
分享
相关文章
Java 与 C++ 区别深入剖析及应用实例详解
本文深入剖析了Java和C++两种编程语言的区别,从编译与执行机制、面向对象特性、数据类型与变量、内存管理、异常处理等方面进行对比,并结合游戏开发、企业级应用开发、操作系统与嵌入式开发等实际场景分析其特点。Java以跨平台性强、自动内存管理著称,适合企业级应用;C++则因高性能和对硬件的直接访问能力,在游戏引擎和嵌入式系统中占据优势。开发者可根据项目需求选择合适语言,提升开发效率与软件质量。附面试资料链接:[点此获取](https://pan.quark.cn/s/4459235fee85)。
49 0
Java List 复制:浅拷贝与深拷贝方法及区别
我是小假 期待与你的下一次相遇 ~
|
2月前
|
【高薪程序员必看】万字长文拆解Java并发编程!(7):不可变类设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中Java不可变类设计指南,废话不多说让我们直接开始。
43 0
Java并发包下Atomic相关类的使用
本文介绍了 `java.util.concurrent.atomic` 包下的各类原子类及其使用场景,包括基本类型原子类(如 `AtomicInteger`、`AtomicLong`)、数组类型原子类(如 `AtomicIntegerArray`)、引用类型原子类(如 `AtomicReference`)、对象属性修改原子类(如 `AtomicIntegerFieldUpdater`)以及原子操作增强类(如 `LongAdder` 和 `LongAccumulator`)。同时,详细对比了不同原子类在高并发场景下的性能表现,展示了 `LongAdder` 的高效性。
92 31
Java多线程基础
本文主要讲解多线程相关知识,分为两部分。第一部分涵盖多线程概念(并发与并行、进程与线程)、Java程序运行原理(JVM启动多线程特性)、实现多线程的两种方式(继承Thread类与实现Runnable接口)及其区别。第二部分涉及线程同步(同步锁的应用场景与代码示例)及线程间通信(wait()与notify()方法的使用)。通过多个Demo代码实例,深入浅出地解析多线程的核心知识点,帮助读者掌握其实现与应用技巧。
【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
91 0
|
2月前
|
java 多线程异常处理
本文介绍了Java中ThreadGroup的异常处理机制,重点讲解UncaughtExceptionHandler的使用。通过示例代码展示了当线程的run()方法抛出未捕获异常时,JVM如何依次查找并调用线程的异常处理器、线程组的uncaughtException方法或默认异常处理器。文章还提供了具体代码和输出结果,帮助理解不同处理器的优先级与执行逻辑。
|
3月前
|
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
128 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
167 23
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问