Runnable接口与Thread类的区别

首先看两个考题:



1.如果使用Thread t=new Test()语句创建一个线程,则下列叙述正确的是
A.Test类一定要实现Runnable接口
B.Test类一定是Thread类的子类
C.Test类一定是Runnable的子类
D.Test类一定是继承Thread类并且实现Runnable接口


正确答案:B
解析:本题考查线程的使用。Java中可以通过实现Runnable接口来创建线程。通过这种方式创建线程是把Runnable的一个对象作为参数传递给Thread类的一个构造方法,该对象提供线程体run()。如果题目中Test实现Runnable接口,则创建线程的方法是Thread t=new Thread(new Test())。Java中另一种创建线程的方法是通过继承 Thread类,重写其中的run()方法定义线程体,然后直接创建该子类的对象即可创建线程。题目中使用Thread t=new Test()语句创建线程,其中直接创建Test类对象,可知该类一定是继承Thread类。因此,本题的正确答案是选项B。


2.下面程序的运行结果:()

public static void main(String args[]) {
        Thread t = new Thread() {
            public void run() {
                pong();
            }
        };
        t.run();
        System.out.print("ping");
    }

    static void pong() {
        System.out.print("pong");
   }

A pingpong        B pongping       C pingpong和pongping都有可能       D 都不输出

答案:B

解析:这里考的是Thread类中start()和run()方法的区别了。start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程,进而调用run()方法来执行任务,而单独的调用run()就跟调用普通方法是一样的,已经失去线程的特性了。因此在启动一个线程的时候一定要使用start()而不是run()。

上题中出现了匿名类:

匿名类这种方法适用于抽象类或接口。
他可以声明在方法或作用域内部,通常这样做可以省去部分定义class的代码,代码看起来更加简洁。
题中匿名类,继承了Thread类,一般我们定义的类都是有名字的如 public class A extends Thread{},这个类的名字是A,它继承了Thread类,在{}中可以写一些方法,包括自定义的也包括重写父类。而像 Thread t = new Thread(){};这样的写法意思是有一个类,继承了Thread,因为这个类只用一次,因此不想给它起名字,所以就用这种匿名类的写法。当此匿名类也需要定义一些新的方法,或者重写父类的方法,就要在后面跟的大括号中完成。这里重写了run()方法。


Runnable接口与Thread类的区别


目前Java中实现多线程可通过实现Runnable接口或者继承Thread,他们之间存在不少区别,建议使用Runnable;

 

首先建立多线程,

extend Thread类:

Java <wbr>多线程实现接口Runnable和继承Thread区别

实现Runnable接口:
Java <wbr>多线程实现接口Runnable和继承Thread区别
测试程序:

Java <wbr>多线程实现接口Runnable和继承Thread区别

区别与联系:

1, 一个类只能继承一个父类,存在局限;一个类可以实现多个接口

2, 在实现Runable接口的时候调用Thread的Thread(Runnable run)或者Thread(Runnable run ,String name)构造方法创建进程时,使用同一个Runnable实例,如上程序中使用的都是rt,则建立的多线程的实例变量也是共享的;

但是通过继承Thread类是不能用一个实例建立多个线程;

故而实现Runnable接口适合于资源共享;

当然,继承Thread类也能够共享变量,能共享Thread类的static变量;

3, Runnable接口和Thread之间的联系:

public class Thread extends Object implements Runnable

可以看出Thread类也是Runnable接口的子类;

下面大家可以直接去看Thread的源代码。


如果使用Thread t=new Test()语句创建一个线程,则下列叙述正确的是
A.Test类一定要实现Runnable接口
B.Test类一定是Thread类的子类
C.Test类一定是Runnable的子类
D.Test类一定是继承Thread类并且实现Runnable接口
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值