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. 2018年第九届蓝桥杯【C++省赛B组】第三题 乘积尾零

    如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?5650 4542 3554 473 946 4114 3871 9073 90 43292758 7949 6113 5659 ...

  2. 2017.11.4 JavaWeb-----基于JavaBean+JSP求任意两数代数和(改进的在JSP页面中无JSP脚本代码的)+网页计数器JavaBean的设计与使用

    修改后的JSP中不含有JSP脚本代码这使得JSP程序的清晰性.简单 1.设计JavaBean 的Add.java 类 package beans; public class Add { private ...

  3. python剑指offer最小的K个数

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 使用快排中的partition思想. ①我们设定part ...

  4. javaweb基础(39)_数据库连接池

    一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...

  5. javaweb基础(35)_jdbc处理oracl大数据

    一.Oracle中大数据处理 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了.因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种 ...

  6. CSS font-size字体大小样式属性

    设置字体大小CSS单词与语法 基本语法结构: .divcss5{font-size:12px;}设置了文字大小为12px像素Font-size+字体大小数值+单位 单词:font-size语法:fon ...

  7. python基础——文件访问模式

    文件访问模式 访问模式 说明 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. w 打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. a 打开一个 ...

  8. mysql架构和历史

    存储引擎 查看: show table status like 'bigcourse'; 结果: +-----------+--------+---------+------------+------ ...

  9. Intellij IDEA 查找接口实现类的快捷键

    查找接口的实现类: IDEA 风格 ctrl + alt +B 查看类或接口的继承关系: ctrl + h 1.IDEA_查找接口的实现 的快捷键 http://blog.csdn.net/u0100 ...

  10. linux系统批量创建用户和生成8位随机密码

    1.1    脚本案例 批量创建20个用户,用户名为user1-user20,并生成8位随机登录密码,用户组采用键盘输入的方式,并将用户名及登录密码保存到/tmp/create_user.txt普通文 ...