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接口的区别的更多相关文章

  1. 多线程——Java中继承Thread类与实现Runnable接口的区别

    线程我只写过继承Thread类的,后来知道java多线程有三种方式,今天首先比较一下常用的继承Thread类和实现Runnable接口的区别. 按着Ctrl键进入Thread之后,发现Thread类也 ...

  2. Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

    1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...

  3. (转)多线程——继承Thread 类和实现Runnable 接口的区别

    java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...

  4. Java中实现多线程继承Thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  5. 多线程——继承Thread 类和实现Runnable 接口的区别

    java中我们想要实现多线程常用的有两种方法,继承Thread 类和实现Runnable 接口,有经验的程序员都会选择实现Runnable接口 ,其主要原因有以下两点: 首先,java只能单继承,因此 ...

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

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  7. [转] Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  8. Java 继承Thread类和实现Runnable接口的区别

    ava中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中,我 ...

  9. Java线程演示样例 - 继承Thread类和实现Runnable接口

    进程(Process)和线程(Thread)是程序执行的两个基本单元. Java并发编程很多其它的是和线程相关. 进程 进程是一个独立的执行单元,可将其视为一个程序或应用.然而,一个程序内部同事还包括 ...

随机推荐

  1. Maven 配置本地依赖jar

    现有json-1.0.jar,引入依赖方法如下: 1.  在项目下新建 lib 目录,复制json-1.0.jar到lib目录下 pom.xml中添加配置 <dependency> < ...

  2. numpy中的inf

    numpy中的inf表示一个无限大的正数 import numpy x = numpy.inf x>9999999999999999999 结果为: True

  3. e.preventdefault() 别滥用

    有的时候我们会为事件回调函数添加一个参数(通常是e),并在函数中加入e.preventdefault():以取消默认行为.由于习惯,我顺手将它写到了一个checkbox的change事件中.由于不同的 ...

  4. 一、初始Object-C

    一.OC概述 特点: 1没有包得概念 2关键字以@开头 3.拓展名 .m 二.第一个OC类 1,分为2个文件..m和.h文件 2. .m文件用来实现类  .h用来定义声明类 .h文件中得写法 //@i ...

  5. extjs3EmptyText 上传自动清空的问题

    在extjs3表单的操作中,输入框经常有提示性的默认字段,比如: // === 接入单位的Form表单 ====== var jrdwForm = new Ext.form.FormPanel({ b ...

  6. Spring 注解中@Resource 和 @Authwired 的区别

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...

  7. ES6初识-函数扩展

    默认值 function test(x,y='world'){ console.log('默认值'); } function test2(...arg){ for(let v of arg){ con ...

  8. PHP 微信公众号之客服完整讲解

    //获取access_token private static function get_access_token($app_id) { $getAuthorizerInfo = wx_auth::g ...

  9. 如何在创建hive表格的python代码中导入外部文件

    业务场景大概是这样的,我要对用户博文进行分词(这个步骤可以看这篇文章如何在hive调用python的时候使用第三方不存在的库-how to use external python library in ...

  10. 【机器学习算法基础+实战系列】SVM

    概述 支持向量机是一种二分类模型,间隔最大使它有别于感知机.支持向量机学习方法由简至繁的模型:线性可分支持向量机(linear support vector machine in linearly s ...