多线程--Thread和Runnable区别

2024-08-26 02:38

本文主要是介绍多线程--Thread和Runnable区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  线程的创建有两种方式,分别是继承Thread类和实现Runnable接口,那么这两种方式有什么相同点,以及区别在何处呢?

  首先通过两个实例还看一下他们的相同之处:

  实例1:使用继承Thread类

   创建子类MultiExtendThread:    

public class MultiExtendThread extends Thread {private   int ticket = 10;//每个线程拥有10张票private String name;MultiThread3(String name) {this.name = name;}public void run() {while (ticket > 0) {System.out.println(ticket-- + " is saled by " + name);}}
}
   测试类:     

 public static void main(String[] args) {MultiExtendThread m1 = new MultiExtendThread ("Window 1");MultiExtendThread m2 = new MultiExtendThread ("Window 2");MultiExtendThread m3 = new MultiExtendThread ("Window 3");//创建3个线程Thread t1 = new Thread(m1 );Thread t2 = new Thread(m2);Thread t3 = new Thread(m3);t1.start();t2.start();t3.start();}
   测试结果:以多线程的形式各自打印出售票信息,每个线程分别打印10条记录,如下:

                 


  实例2:使用实现Runnable接口方式

    实现Runnable接口的类:      

public class MultiThread1 implements Runnable {private int ticket = 10;//每个线程都拥有10张票private String name;MultiThread1(String name) {this.name = name;}public void run() {while (ticket > 0) {System.out.println(ticket-- + " is saled by " + name);}}
   测试类:      

public static void main(String[] args) {MultiThread1 m1 = new MultiThread1("Window 1");MultiThread1 m2 = new MultiThread1("Window 2");MultiThread1 m3 = new MultiThread1("Window 3");//创建3个线程Thread t1 = new Thread(m1 );Thread t2 = new Thread(m2);Thread t3 = new Thread(m3);t1.start();t2.start();t3.start();}
   测试结果同实例1

   通过以上两个实例,来看一下两者的相同之处:

     都可以保证新建线程彼此相互独立,各自拥有资源,互补干扰。在这样的场景先,无论使用哪种形式都可以。

   不同之处:

     java的一个特性是仅支持单继承,这样如果是通过继承Thread来实现多线程时,该类将无法再扩展其他的类,不能实现负责的功能。而使用实现Runnable接口时,同样还可以实现其他的接口,这样就避免单继承所带来的局限。还有一点是,实现Runnable接口创建的线程还可以处理同一资源,实现资源的共享。

  实例3:多个售票窗口可以共同售10张票   

public class MultiThread2 implements Runnable {private int ticket = 10;@Overridepublic void run() {while (ticket > 0) {System.out.println(ticket-- + " is saled by " + Thread.currentThread().getName());}}
}
  测试类:     

public static void main(String[] args) {//创建一个实例MultiThread2 m = new MultiThread2();//创建三个线程,三个线程共同拥有同一个实例Thread t1 = new Thread(m, "Window 1");Thread t2 = new Thread(m, "Window 2");Thread t3 = new Thread(m, "Window 3");t1.start();t2.start();t3.start();}
   实例结果:

     


 总结:

 采用继承Thread类方式:
 (1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
 (2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
 采用实现Runnable接口方式:
 (1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况。
 (2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。

这篇关于多线程--Thread和Runnable区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107318

相关文章

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

Python中@classmethod和@staticmethod的区别

《Python中@classmethod和@staticmethod的区别》本文主要介绍了Python中@classmethod和@staticmethod的区别,文中通过示例代码介绍的非常详细,对大... 目录1.@classmethod2.@staticmethod3.例子1.@classmethod

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

Python中json文件和jsonl文件的区别小结

《Python中json文件和jsonl文件的区别小结》本文主要介绍了JSON和JSONL两种文件格式的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 众所周知,jsON 文件是使用php JSON(JavaScripythonpt Object No

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

python中json.dumps和json.dump区别

《python中json.dumps和json.dump区别》json.dumps将Python对象序列化为JSON字符串,json.dump直接将Python对象序列化写入文件,本文就来介绍一下两个... 目录1、json.dumps和json.dump的区别2、使用 json.dumps() 然后写入文

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro