Java中,通过实现Runnable接口来创建进程时,没有继承Thread类,为啥却可以创建Thread类对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中,通过实现Runnable接口来创建进程时,没有继承Thread类,为啥却可以创建Thread类对象相关的知识,希望对你有一定的参考价值。

class Ticket implements Runnable

private int tick = 100;

Object obj = new Object();

public void run()

while(true)


synchronized(obj)

if(tick > 0)

tryThread.sleep(10);catch (Exception e)

System.out.println(Thread.currentThread().getName()+"...sale:" + tick--);







class TicketDemo

public static void main(String[] args)

Ticket t = new Ticket();

Thread t1 = new Thread(t); //为什么没有继承Thread却可以创建Thread类对象
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);

t1.start();
t2.start();
t3.start();
t4.start();

首先,Runnable 是Java 用来实现多线程的接口。
PS:Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口.
在使用Thread的时候只需要new一个实例出来,调用start()方法即可以启动一个线程。
Thread Test = new Thread();
Test.start();
在使用Runnable的时候需要先new一个继承Runnable的实例,之后用子类Thread调用。
Test impelements Runnable
Test t = new Test();
Thread test = new Thread(t);

在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。
实现Runnable接口相比 继承Thread类有如下好处:
->避免点继承的局限,一个类可以继承多个接口。追问

请问为什么在使用Runnable的方法来创建线程的时候。只是实现了Runnable接口,并没有看到Thread类。但却可以创建Thread类对象,比如此处:Thread test = new Thread(t);的test对象。这是为什么呀?

参考技术A 仔细看API里面的介绍:
1,进入API找到Thread类里面的start()方法,里面介绍到: 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
2,进入API找到Thread类里面的run()方法,里面介绍到: 如果该线程是使用独立的Runnable 运行对象构造的,则调用该
Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。

Java第九天

创建线程的第一种方式:继承Thread类

创建线程的第二种方式:实现Runnable接口

1.定义类实现Runnable接口。

2.覆盖接口中的run方法,将线程的任务代码封装到run方法中。

3.通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类中的构造函数的参数进行传递。

为什么?因为线程的任务都封装在Runnable接口子类对象的run方法中。所以要在线程对象创建时就必须明确要运行的任务。

4.调用线程对象的start方法开启线程。

 

实现Runnable接口的好处:

1.将线程的任务从线程的子类中分离出来,进行了单独的封装。按照面向对象的思想将任务封装成对象。

2.避免了java单继承的局限性。

以上是关于Java中,通过实现Runnable接口来创建进程时,没有继承Thread类,为啥却可以创建Thread类对象的主要内容,如果未能解决你的问题,请参考以下文章

java笔记Java中的多线程

Java创建线程的两种方法

JAVA多线程用实现Runnable接口的方式创建线程

多线程

Java之多线程方式二(实现Runnable接口)

java并发基础