多线程--Thread和Runnable区别
来源:互联网 发布:rfid读写器java源代码 编辑:程序博客网 时间:2024/05/20 22:02
线程的创建有两种方式,分别是继承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; @Override public 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区别
- 多线程--Thread和Runnable区别
- java 多线程 Thread和Runnable的区别
- java多线程 Runnable和Thread区别
- Java多线程Thread和Runnable的区别
- 多线程中Thread和Runnable的区别
- Runnable和Thread实现多线程区别实例
- Thread和Runnable实现多线程的区别
- Thread和Runnable实现多线程的区别
- Thread和Runnable实现多线程的区别
- Thread和Runnable实现多线程的区别
- Java 多线程:Thread 和 Runnable 区别
- Android 多线程Thread和Runnable的区别
- 多线程 Thread 和Runnable
- 多线程Thread和Runnable
- 多线程二,Java多线程thread和runnable区别简介
- Thread 和 runnable 区别
- Thread和Runnable区别
- Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
- OBB文件和StorageManager类使用介绍
- Android手机检测多点触摸
- Jeddict:从服务器的验证过程,思考学习新事物的套路
- request获取各种路径
- 多线程--Thread和Runnable区别
- 前端工程化入门
- log4j配置文件位置详解
- 再次接触Linux操作系统,才发现它的魅力所在!
- 为什么要用PolyFill(JS中的修补匠)
- XUtils3.0数据库的一些操作
- easyui datetimebox修改默认显示格式
- 【补充】为什么初始化SDRAM中 adrl r2, mem_cfg_val而不是 ldr r2,=mem_cfg_val
- redis的集群-redis系列教程