Java中Runnable和Thread的区别的疑问

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()

方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

1、避免点继承的局限,一个类可以继承多个接口。

2、适合于资源的共享

以上为在其他博客上看到的观点,还有一篇专门文章讲“Runnable可以实现资源共享但Thread不能实现资源共享的原因”,这是链接,但是如果换另一种思路看起来也是可以实现Thread资源共享的,不知对不对…

上代码:

一个继承自Thread类:

package com.zz.bridge;
/**
 * 扩展自Thread类
 * Copyright 2015年6月13日
 * created by txxs
 * all right reserved
 */
public class ThreadDemo0 extends Thread {
    private int ticket = 5;  

    public void run(){
        for(int i =0;i<500;i++){
            if(this.ticket>0){
                System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
            }
        }
    }
}

一个实现Runnable接口

package com.zz.bridge;
/**
 * 实现Runnable接口
 * Copyright 2015年6月13日
 * created by txxs
 * all right reserved
 */
public class ThreadDemo1 implements Runnable {
    private int ticket =5;  

    @Override
    public void run(){
        for(int i =0;i<500;i++){
            if(this.ticket>0){
                System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
            }
        }
    }

}

分别对应的测试类和实现的结果:

ThreadDemo0的测试类:

package com.zz.bridge;
/**
 * 测试继承自Thread类
 * Copyright 2015年6月14日
 * created by txxs
 * all right reserved
 */
public class ThreadTest2 {

	public static void main(String[] args) {
        /**
         * 之前的博客(http://blog.chinaunix.net/uid-20665441-id-310538.html)说,
         * 继承Thread类的实例,用同一个实例化对象就会异常,不明白,亲自试了一下
         * 发现这两种方式都可以实现线程共享,不明白为什么大家都说不可以
        */
        ThreadDemo0 ticketThread0 = new ThreadDemo0();
        Thread th4 = new Thread(ticketThread0);    //线程一
        th4.setName("售票口10");
        Thread th5 = new Thread(ticketThread0);    //线程二
        th5.setName("售票口11");
        Thread th6 = new Thread(ticketThread0);    //线程三
        th6.setName("售票口12");
        th4.start();
        th5.start();
        th6.start();
	}

}

ThreadDemo0结果:

ThreadDemo1的测试类:

package com.zz.bridge;
/**
 * 实现Runnable接口
 * Copyright 2015年6月14日
 * created by txxs
 * all right reserved
 */
public class ThreadTest1 {

	public static void main(String[] args) {

		ThreadDemo1 ticketThread1 = new ThreadDemo1();
        Thread th1 = new Thread(ticketThread1);    //线程一
        th1.setName("售票口7");
        Thread th2 = new Thread(ticketThread1);    //线程二
        th2.setName("售票口8");
        Thread th3 = new Thread(ticketThread1);    //线程三
        th3.setName("售票口9");
        th1.start();
        th2.start();
        th3.start();

	}

}

运行结果:

从以上的运行结果可以看出,继承Thread和实现Runnable都实现了资源共享,但是为什么大家都认为这种方式不可以呢,还是我实现的方式有问题?

时间: 2024-08-25 10:24:37

Java中Runnable和Thread的区别的疑问的相关文章

Java中Runnable和Thread的区别

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限. 下面看例子: 代码如下: package org.thread.demo; class MyThread extends Thread{ private String name; public MyThread(String

Java中Runnable和Thread

java中有两种实现多线程的方式:一种是继承Thread类,一种是实现Runnable接口. 1.java启动线程为什么使用start函数呢? 在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了private native void start0(); 其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface). 2.联系和区别: Thre

Java中线程(Thread)知识概括

Java中线程(Thread)知识概括 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程. 例如:Java VM 启动的时候会有一个进程java.exe.该进程中至少一个线程负责java程序的执行,而且这个线程运行的代码存在于main方法中.该线程称之为主线程.jvm启动不止一个线程,还有负责垃圾回收机制等线程. 如何在自定义的代码中,自定义一个线程呢

java学习笔记——Java中HashMap和TreeMap的区别深入理解

本文转载自Java中HashMap和TreeMap的区别深入理解 首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 

【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧. 很多常见的面试问题如"抽象类和接口有什么区别","你在什么时候用抽象类什么时候用接口".所以在这篇文章里面,我们会讨论一下这个话题. 在开始讨论它们的区别之前,我们先看看它们的介绍. Abstract class 抽象类 抽象类被用来抽象出子类的共同特征.它是不能被实例化的,它只能被子类继承作为超类使用.抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to c

java中String与StringBuilder的区别

本篇文章介绍了,java中String与StringBuilder的区别. 相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE 5.0 里面带来的一个新的字符操作的类—— StringBuilder (先别忙着扔我砖头,我还算清醒,我这里说的不是 C #, Java 也有 StringBuilder 类).那么这个 StringBuilder 和

java中extends与implements的区别

学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 2.extends是继承父类,只要那个类不是声明为f

java中抽象类与接口的区别

转自: http://blog.csdn.net/tp7309/article/details/10452445 二者的区别快忘得差不多了,从别处看到这文章感觉写的不错,正好复习复习,也给大家分享一下. 抽象类 abstract class 包含抽象方法的类,叫抽象类.而抽象的概念就是抽象出共同属性:成员变量和方法.所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法.当然抽象方法是一定要有的. 抽象类是用于单一继承的,不能实例化.而继承类一定要实现抽象方法,因为抽象

Java中Vector和ArrayList的区别

首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复. 3个具体实现类的相关区别如下: ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中.当从ArrayList的中间位置插入或者删除元素时,需要对数组