【多线程学习(2)】继承Thread类和实现Runnable接口、Callable接口的区别
1)Runnable和Callable同是接口
* Callable的任务执行后可返回值,而Runnable的任务是不能返回值(是void);call方法可以抛出异常,run方法不可以
* 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
* 加入线程池运行,Runnable使用ExecutorService的execute方法,Callable使用submit方法。
2)Thread类和Runnable接口
基于java的单继承限制,这两者第一个区别:
* 避免java单继承的局限性
* runnable接口可以自动实现资源的共享,对于Thread类,如果想要实现共享,需要将共享资源变成静态资源。这一点以卖票案例为例,如下:
继承Thread类
class ExtendsThreadextends Thread{
private int ticket = 5;
private String name;
public FirstThread(String name){
this.name = name;
}
public void run(){
for(int i=0;i<10;i++){
if(ticket > 0){
System.out.println("继承Thread-->"+name +" 卖票: " + (ticket--));
}
}
}
}
public class InitThread {
public static void main(String[] args) {
new ExtendsThreadextends ("一号窗口").start();
new ExtendsThreadextends ("二号窗口").start();
new ExtendsThreadextends ("三号窗口").start();
}
}
output:

实现Runnable接口
class SecondThread implements Runnable{
private int ticket = 5;
@Override
public void run() {
for(int i=0;i<10;i++){
if(ticket > 0){
System.out.println("实现Runnable-->"+ Thread.currentThread().getName()+" 卖票: " + (ticket--));
}
}
}
}
public static void main(String[] args) {
SecondThread secondThread = new SecondThread();
new Thread(secondThread,"一号窗口").start();
new Thread(secondThread,"二号窗口").start();
new Thread(secondThread,"三号窗口").start();
}
output:

1.以上第一种new 了3个Thread 对象,可以看到相当于三个独立的线程在执行卖票任务;第二种也是new了3个对象,但是只有一个Runnable对象,3个Thread共享这个Runnable对象的代码,因此出现了三个线程共同执行卖票任务的结果。如果new出3个Runnable对象执行的话,也会出现3个线程独自各卖5张票。
2.第二种就达到了资源共享的目的,如果想要第一种也实现第二种的效果的话,把ticket变量改成static即可,所以说资源共享是相对的。
3.资源共享就设计到线程安全问题,ticket--操作并不具有原子性。ticket有可能输出负数,在System.out...前面加上线程休眠操作,会出现以下结果:

当ticket=1的时候,窗口一执行到ticket>0,窗口二执行到ticket--,此时ticket已经是0了,但是窗口三、一线程还是会继续执行ticket--操作,导致输出ticket为0,甚至为负数。
要解决这个问题,需要引入线程的同步操作即互斥锁。
【多线程学习(2)】继承Thread类和实现Runnable接口、Callable接口的区别的更多相关文章
- 多线程——Java中继承Thread类与实现Runnable接口的区别
线程我只写过继承Thread类的,后来知道java多线程有三种方式,今天首先比较一下常用的继承Thread类和实现Runnable接口的区别. 按着Ctrl键进入Thread之后,发现Thread类也 ...
- Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别
1. Java中线程的创建有两种方式: (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...
- (转)多线程——继承Thread 类和实现Runnable 接口的区别
java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...
- Java中实现多线程继承Thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- 多线程——继承Thread 类和实现Runnable 接口的区别
java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...
- Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- [转] Java中继承thread类与实现Runnable接口的区别
Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中, ...
- Java 继承Thread类和实现Runnable接口的区别
ava中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 在实际应用中,我 ...
- Java线程演示样例 - 继承Thread类和实现Runnable接口
进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...
随机推荐
- python 添加 threadpool
操作系统: Ubuntu 10.04 python安装依赖的软件包: python 出现 ImportError: No module named ** 我这里出现了: ImportError: No ...
- Ubuntu 10.04上安装MongoDB
MongoDB是一个可扩展.高性能的下一代数据库.MongoDB中的数据以文档形式存储,这样就能在单个数据对象中表示复杂的关系.文档可能由 以下几 部分组成:独立的基本类型属性.“内嵌文档”或文档数组 ...
- iOS 实时监测网络状态(通过Reachability)
在AppDelegate.m中 @property (nonatomic, strong) Reachability *reach; - (BOOL)application:(UIApplicatio ...
- socket传送二进制流的一些总结
第一次实质性的接触socket通信方面的工作,所以遇到的问题还真不少,写篇博客记录一下,提升下记忆. 需求是通过私有协议进行二进制数据的传输,必须保证数据包不能被丢失,所以选择tcp的socket进行 ...
- datatable 默认按某字段排序
"columns": [ { data: null}, { data: 'name'}, { data: 'birthday'} ], "order": [[ ...
- 【牛客 错题集】Linux系统方面错题合集
前言:牛客Linux322道全部刷完,有些题目较老,甚至考核5系统,现在7都出来了几年了 = = 还有些题目解析的很好部分也摘录了进来.很多涉及嵌入式开发的选择题同样的摘录的作为了解使用 ------ ...
- Ajax上传文件/照片时报错TypeError :Illegal invocation
问题 Ajax上传文件/照片时报错TypeError :Illegal invocation 解决 网上搜索问题,错误原因可能有以下几个,依次检查: 请求类型有误,如post请求,但在后台设置的是ge ...
- Jenkins持续化集成
Jenkins介绍 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. 安装环境 操作系统:lin ...
- MyCat实现数据库与数据库之间的读写分离
一.Mycat的安装准备: 1.jdk:要求jdk必须是1.7及以上版本 2.Mysql:推荐mysql是5.5以上版本 3.Mycat: Mycat的官方网站: http://www.mycat.o ...
- 深度CNN
[具体参考可以看这里(https://cloud.tencent.com/developer/article/1369425)