Java线程中run和start方法的区别

如题所述

Thread类中run()和start()方法的区别如下:
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;

阅读下面代码及注释就明白了

package com.ljq.test;

public class ThreadTest {
    
    /**
     * è§‚察直接调用run()和用start()启动一个线程的差别 
     * 
     * @param args
     * @throws Exception
     */
    public static void main(String[] args){
        Thread thread=new ThreadDemo();
        //第一种
        //表明: run()和其他方法的调用没任何不同,main方法按顺序执行了它,并打印出最后一句
        //thread.run();
        
        //第二种
        //表明: start()方法重新创建了一个线程,在main方法执行结束后,由于start()方法创建的线程没有运行结束,
        //因此主线程未能退出,直到线程thread也执行完毕.这里要注意,默认创建的线程是用户线程(非守护线程)
        //thread.start();
        
        //第三种
        //1、为什么没有打印出100句呢?因为我们将thread线程设置为了daemon(守护)线程,程序中只有守护线程存在的时候,是可以退出的,所以只打印了七句便退出了
        //2、当java虚拟机中有守护线程在运行的时候,java虚拟机会关闭。当所有常规线程运行完毕以后,
        //守护线程不管运行到哪里,虚拟机都会退出运行。所以你的守护线程最好不要写一些会影响程序的业务逻辑。否则无法预料程序到底会出现什么问题
        //thread.setDaemon(true);
        //thread.start();
        
        //第四种
        //用户线程可以被System.exit(0)强制kill掉,所以也只打印出七句
        thread.start();
        System.out.println("main thread is over");
        System.exit(1);
    }
    
    public static class ThreadDemo extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("This is a Thread test"+i);
            }
        }
    }
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2016-08-08
楼主您好
之所以出现线程,就是为了更好的利用CPU,让她更加“精明”的干活。

通过调用Thread类的start()方法来启动一个线程,
这时此线程是处于就绪状态,
并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,
它包含了要执行的这个线程的内容,
Run方法运行结束,
此线程终止,
而CPU再运行其它线程,

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

记住:线程就是为了更好地利用CPU,
提高程序运行速率的!

public class TestThread1{
public static void main(String[] args){
Runner1 r=new Runner1();
//r.run();//这是方法调用,而不是开启一个线程
Thread t=new Thread(r);//调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。
t.start();

for(int i=0;i<100;i++){
System.out.println("进入Main Thread运行状态");
System.out.println(i);
}
}
}
class Runner1 implements Runnable{ //实现了这个接口,jdk就知道这个类是一个线程
public void run(){

for(int i=0;i<100;i++){
System.out.println("进入Runner1运行状态");
System.out.println(i);
}
}
}本回答被提问者采纳

Java线程中run和start方法的区别
区别:调用start方法实现多线程,而调用run方法没有实现多线程 Start:用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执...

java启动一个线程是用run()还是start()?run()和start()的区别?
START()是方法,它调用RUN()方法.而RUN()方法是你必须重写的. run()方法中包含的是线程的主体

Java线程中run和start方法的区别
通过调用一个线程类的run方法是相当于直接调用run方法,不会单独启动一个线程,此时,run方法只相当于一个普通类当中的一个普通方法,run中实现的算法依然会放入主线程去执行;而调用start方法是启动线程的标准方法,调用start以后就会启动一个独立的线程,该线程的任务就是执行run中的所有逻辑,逻辑执行完...

java创建线程之后,直接调用start方法和run的区别
start与run方法的主要区别在于当程序调用start方法一个新线程将会被创建,并且在run方法中的代码将会在新线程上运行,然而在你直接调用run方法的时候,程序并不会创建新线程,run方法内部的代码将在当前线程上运行。大多数情况下调用run方法是一个bug或者变成失误。因为调用者的初衷是调用start方法去开启一个...

java中Thread线程中的 start和run方法的区别
run方法中是你想要做的事。他不能直接调用。而是用start方法来调用,运行run方法。

run方法和start方法的区别
Java线程中run和start方法的区别 Thread类中run()和start()方法的区别如下:run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;package com.ljq.test;public class ThreadTest { \/ 观察直接调用...

线程的start()和run()区别?
start(),run() 都是Thread 类里的静态方法。操作方法如下:1、创建一个JAVA工程。2、新建一个ThreadTest类并创建一个attack方法。3、在main方法中new一个线程并在run方法中执行attack()方法。4、运行main方法,控制台只有一个线程说明run()方法只是Thread的一个普通方法调用。5、使用start()。6、...

java中thread的start和run的区别
)方法 } } 在这个例子中,新建一个线程对象t,当用t.start()时,启动一个新线程,main()方法所在的主线程也继续运行,也就是说有两个线程在独立运行。当用:t.run()时,在当前主线程中运行t的run方法,也就是说,只有一个线程。当多线程方法中有死循环时,会造成主线程失去响应。

java线程中为什么要调用start而不能run
线程的运行不是像其他方法那么简单的额调用一下就运行的。想要运行一个线程,肯定是要和操作系统打交道,告诉操作系统我要添加一个线程,run方法只是个简单的方法,里面就是你要运行的代码。start方法里面会调用一个native方法,这个方法才是真正和操作系统交流的 ...

在java中。为什么这儿的r.run()有没有最终的输出结果都一样 ? run...
线程中run()方法用于声明线程需要处理的业务,而start()是用于启动线程的,线程启动后,会自动调用run()方法。即start()方法中调用到了run()方法。

相似回答