实现Runnable和继承Thread的区别
啥都先不说,运行两段程序看看结果再分析
实现Runnable接口的程序代码
public class ThreadTest1 implements Runnable {
private int num = 10;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
if (num > 0) {
System.out.println(Thread.currentThread().getName()+"执行结果:" + (num--));
}
}
}
public static void main(String[] args) {
ThreadTest1 t1 = new ThreadTest1();
Thread t01 = new Thread(t1, "线程1");
Thread t02 = new Thread(t1, "线程2");
Thread t03 = new Thread(t1, "线程3");
t01.start();
t02.start();
t03.start();
}
}
运行结果:
线程2执行结果:
线程3执行结果:
线程3执行结果:
线程1执行结果:
线程3执行结果:
线程2执行结果:
线程3执行结果:
线程3执行结果:
线程1执行结果:
线程2执行结果:
继承Thread类的实现代码
public class ThreadTest2 extends Thread{
private int num = 10;
@Override
public void run() {
for(int i =0; i <=100; i++) {
if(num >0) {
System.out.println(Thread.currentThread().getName()+"执行结果:"+(num--));
}
}
}
public static void main(String[] args) {
ThreadTest2 t01 = new ThreadTest2();
ThreadTest2 t02 = new ThreadTest2();
ThreadTest2 t03 = new ThreadTest2();
t01.start();
t02.start();
t03.start();
}
}
运行结果:
Thread-0执行结果:
Thread-0执行结果:
Thread-0执行结果:
Thread-0执行结果:
Thread-0执行结果:
Thread-0执行结果:
Thread-0执行结果:
Thread-0执行结果:
Thread-0执行结果:
Thread-0执行结果:
Thread-1执行结果:
Thread-1执行结果:
Thread-1执行结果:
Thread-1执行结果:
Thread-1执行结果:
Thread-1执行结果:
Thread-1执行结果:
Thread-1执行结果:
Thread-2执行结果:
Thread-2执行结果:
Thread-2执行结果:
Thread-1执行结果:
Thread-2执行结果:
Thread-1执行结果:
Thread-2执行结果:
Thread-2执行结果:
Thread-2执行结果:
Thread-2执行结果:
Thread-2执行结果:
Thread-2执行结果:
从上面的运行结果可以看出,两者的区别。
实现Runnable接口的,对于三个线程来说共享的是ThreadTest1对象的资源。
继承Thread类,三个线程都是独立的运行,线程间不共享资源。
所以可以总结出以下区别:
1.Runnable接口的话,可以避免单继承的局限性,具有较强的健壮性。
2.Runnable可以实现资源的共享,同时处理同一资源。
3.Thread类的线程间都是独立运行的,资源不共享。
4.继承Thread类不再被其他类继承(java不存在多继承)
实现Runnable和继承Thread的区别的更多相关文章
- Java 多线程实现接口Runnable和继承Thread区别(转)
Java 多线程实现接口Runnable和继承Thread区别 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别 ...
- 实现Runnable接口和继承Thread类区别
如果一个类继承Thread,则不适合资源共享.但是如果实现了Runable接口的话,则很容易的实现资源共享. 实现Runnable接口比继承Thread类所具有的优势: 1):适合多个相同的程序代码的 ...
- (转)多线程——继承Thread 类和实现Runnable 接口的区别
java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...
- java中的线程问题(三)——继承Thread VS 实现Runnable的区别
从java的设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jdk帮助文档我们可以看到Thread类本身就实现了Runnable接口,如果一定要说它们有什么区别, ...
- 【多线程学习(2)】继承Thread类和实现Runnable接口、Callable接口的区别
1)Runnable和Callable同是接口 * Callable的任务执行后可返回值,而Runnable的任务是不能返回值(是void);call方法可以抛出异常,run方法不可以 * 运行Cal ...
- 多线程——Java中继承Thread类与实现Runnable接口的区别
线程我只写过继承Thread类的,后来知道java多线程有三种方式,今天首先比较一下常用的继承Thread类和实现Runnable接口的区别. 按着Ctrl键进入Thread之后,发现Thread类也 ...
- 多线程——继承Thread 类和实现Runnable 接口的区别
java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...
- java 多线程 继承Thread和实现Runnable的区别
1)继承Thread: public class ThreadTest extends Thread { private int count; private String name; public ...
- Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
随机推荐
- SQLALchemy的其他常用操作
使用连接池的两种方式 第一种方式: 直接从SessionFactory里获取,此时如果需要开启多个进程,那么创建连接池的代码一定要放在循环里面 不然的话每个进程都是用一个session了 from s ...
- py-统计一个矩阵中每一列的非0数的个数
1.文件类型类似于这样: 不过数据量比这个要更大一点. 2.对应上述数据的运行结果: import matplotlib.pyplot as plt with open('test.txt') as ...
- Jenkins节点配置页面,启动方法没有"Launch agent via Java Web Start"解决方法?
Jenkins的配置从节点中默认没有Launch agent via JavaWeb Start,解决办法: 步骤: 1:打开"系统管理"——"Configure Glo ...
- linux automake使用
一篇文章: 一.Makefile介绍 Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有 ...
- AviMemDc: a C++ class
AviMemDc: a C++ class This class is used in the Avi Examples.The header fileAviMemDC.h /* ...
- 深入理解JS对象和原型链
函数在整个js中是最复杂也是最重要的知识 一个函数中存在多面性: 1.它本身就是一个普通的函数,执行的时候形成的私有作用域(闭包),形参赋值,预解释,代码执行,执行完 成后栈内存销毁/不销毁. 2.& ...
- Git-创建和合并分支
本人拜读了廖雪峰老师关于Git的讲述后整理所得 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你 ...
- javascript与jQuery的each,map回调函数参数顺序问题
<script> var arr = [2,3,6,7,9]; //javascript中的forEach 和 map方法 arr.forEach(function(value,index ...
- fiddler操作改到本地
urlreplace test5.api.bookapi.cn:8889 localhost:8080
- 通过存储过程创建SQL作业
USE dbNameGO/****** Object: StoredProcedure [dbo].[usp_Createjob] Script Date: 03/26/2014 14:36:30 * ...