您当前的位置:首页 > 互联网教程

Java中Runnable和Thread的区别

发布时间:2025-05-20 09:59:36    发布人:远客网络

Java中Runnable和Thread的区别

一、Java中Runnable和Thread的区别

线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法,

我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样.

你简单的调用run方法是没有这样效果的,所以你必须调用Thread类的start方法来启动你的线程.所以你启动线程有两种方法

一是写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程

二是写一个类实现Runnable接口,实现里面的run方法,用newThread(Runnabletarget).start()方法来启动

这两种方法都必须实现RUN方法,这样线程起动的时候,线程管理器好去调用你的RUN方法.

你的TestThread没有继承自Thread类,怎么可能会有start方法呢?

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;

Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的

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

System.out.println("线程开始:"+this.name+",i="+i);

publicstaticvoidmain(String[]args){

MyThreadmt1=newMyThread("线程a");

MyThreadmt2=newMyThread("线程b");

//thread1,thread2,按顺序进行

但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动

publicstaticvoidmain(String[]args){

MyThreadmt1=newMyThread("线程a");

MyThreadmt2=newMyThread("线程b");

这样程序可以正常完成交互式运行。那么为啥非要使用start()方法启动多线程呢?

在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了privatenativevoidstart0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(javaNativeInterface)

在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。

classMyThreadimplementsRunnable{

System.out.println("线程开始:"+this.name+",i="+i);

但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:publicThread(Runnabletarget)

此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多

线程。(start()可以协调系统的资源):

importorg.runnable.demo.MyThread;

publicstaticvoidmain(String[]args){

MyThreadmt1=newMyThread("线程a");

MyThreadmt2=newMyThread("线程b");

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比

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

以卖票程序为例,通过Thread类完成:

System.out.println("卖票:ticket"+this.ticket--);

下面通过三个线程对象,同时卖票:

publicstaticvoidmain(String[]args){

mt1.start();//每个线程都各卖了10张,共卖了30张票

mt2.start();//但实际只有10张票,每个线程都卖自己的票

mt3.start();//没有达到资源共享

如果用Runnable就可以实现资源共享,下面看例子:

classMyThreadimplementsRunnable{

System.out.println("卖票:ticket"+this.ticket--);

publicstaticvoidmain(String[]args){

newThread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一

newThread(mt).start();//个实例化对象mt,就会出现异常

虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。

Runnable接口和Thread之间的联系:

publicclassThreadextendsObjectimplementsRunnable

发现Thread类也是Runnable接口的子类。

二、java中thread的start()和run()有何区别

1、start()方法来启动线程,真正实现了多线程运行,这时无需等待。

run方法体代码执行完毕而直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。

通过Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程。

2、run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码;

而如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程--这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。

3、调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

4、这两个方法需要把并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.。

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。

通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

参考资料来源:百度百科-java基础

三、java thread是什么意思

1、Java中的thread就是线程的意思,它是Java中用来实现多任务处理的机制之一。以下是关于Java线程的一些关键点:

2、综上所述,Java线程是实现多任务处理和并发编程的重要机制,它能够提高程序的运行效率和响应速度,同时需要开发者具备深入了解线程机制的知识来更好地运用它。