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

作者&投稿:年河 (若有异议请与网页底部的电邮联系)
java中thread的start和run的区别~

java中thread的start()方法和run()方法的区别:
t.start(); 该行代码相当于是启动线程,
t.run(); 该行代码相当于是使用t这个类中的run方法而已。

run()方法,用于封装线程运行的任务代码。直接用创建的线程对象调用,
并没有产生新的线程,仅仅是当前正在运行的线程(如,主线程)在执行run方法.
start()方法,共有两个作用,1,开启了当前线程,也就是说,
当前程序又多了一条执行路径和当前线程(主线程)并发执行。
而run()方法会被新开启的线程运行。2,调用线程的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的start和run在功能、是否创建新线程、和是否在新线程重复调用上有所区别:

1、功能不同

run是Runnable接口中定义的一个方法,是为了让客户程序员在这个方法里写自己的功能代码的。直接调用和普通的类调用自己的成员方法是没有任何区别的。

start则是线程开始运行的标志,当这个方法被调用后,程序中才会多出一个独立的线程,接着便是执行run方法。

2、是否会创建新线程

run方法的时候,程序并不会创建新线程,run方法内部的代码将在当前线程上运行。

start方法一个新线程将会被创建,并且在run方法中的代码将会在新线程上运行。

3、新线程启用是是否能重复调用

run可以在一个线程被启动,可以重复调用该thread对象的run方法。

start在一个线程被启动,你不能重复调用该thread对象的start方法,调用已经启动线程的start方法将会报IllegalStateException异常。

总结:如果要写单独的线程,最好还是继承Thread来做,如果是实现接口的话,到主线程里,还是要new Thread(new YourRunnableClass)来调用,可能会有所不便。

参考资料:百度百科 线程



1、运行的方式不同:

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

(2)run()方法当作普通方法的方式调用,程序还是要顺序执行。

2、run方法的实现不同:

(1)start()的run方法体代码执行完毕而直接继续执行下面的代码;

(2)run()的要等待run方法体执行完毕后才可继续执行下面的代码。

3、线程的不同:

(1)start()通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行;

(2)run方法只是thread的一个普通方法调用,还是在主线程里执行。

扩展资料

1、run方法:不启动新线程

public void run() {    if (target != null) {

target.run();
}}

2、start()方法:启动一个线程

public synchronized void start() {

if (threadStatus != 0)

throw new IllegalThreadStateException();

group.add(this);

boolean started = false;

try {

start0();

started = true;

} finally {

try {

if (!started) {

group.threadStartFailed(this);

}

} catch (Throwable ignore) {

}}}

private native void start0();



  1) start:
  用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
  2) run:
  run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.。

start为线程入口,通过它启动线程,其源代码
public synchronized void start() {
if (started)
throw new IllegalThreadStateException();
started = true;
group.add(this);
start0();
}

run为实际代码执行段

如果在程序中直接调用run的话就变成了普通方法,因为没有将它加入到线程组中

如果你用run,就会发现程序会假死,因为它只是一个常规方法的调用,还是用的main这个线程


高港区13477346464: java中thread的start()和run()有何区别? -
阚乔皮肤: 1、运行的方式不同:(1)start()方法来启动线程,真正实现了多线程运行,这时无需等待;(2)run()方法当作普通方法的方式调用,程序还是要顺序执行.2、run方法的实现不同:(1)start()的run方法体代码执行完毕而直接继续执...

高港区13477346464: java中thread的start和run的区别 -
阚乔皮肤: start() :它的作用是启动一个新线程. 通过start()方法来启动的新线程,处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行相应线程的run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容...

高港区13477346464: JAVA里thread.start与thread.join 哪个有前哪个在后? -
阚乔皮肤: 线程必须要先start,才能join,只有启动了,才能对线程进行操作. 如有一个线程叫A,那么请看以下示例代码 A.start(); //启动A线程 A.join(); //邀请A线程先执行,本线程先暂停执行,等待A线程执行完后,主线程再接着往下执行 System.out.println("OK"); //这句话,要等到A线程执行完后,主线程获取到执行权后,才会被执行这里的主线程是指执行以上三行代码的线程

高港区13477346464: Java中Thread类的start和run的区别 -
阚乔皮肤: Start是启动一个线程,run是执行一个线程,一个线程被创建后,必须先start 然后才执行run方法做具体的事情

高港区13477346464: java中Thread线程中的 start和run方法的区别 -
阚乔皮肤: run方法中是你想要做的事.他不能直接调用.而是用start方法来调用,运行run方法.

高港区13477346464: JAVA中Thread类的start()方法引用 -
阚乔皮肤: System.exit(1); 因为这里,你在主线程里把你的线程停掉了.......System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序

高港区13477346464: java 线程里面 start() 方法是如何运行的?
阚乔皮肤: 使该线程开始执行;Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法). 多次启动一个线程是非法的.特别是当线程已经结束执行后,不能再重新启动.

高港区13477346464: 在java中启动线程使用run()还是start()? -
阚乔皮肤: 启动一个线程用start()方法,使线程所代表的虚拟处理机处于可运行的状态,这意味着它可以有JVM(java虚拟机)来调度和执行,这并不意味着线程就会立即执行.run()方法可以产生必须退出的标志来停止一个线程.

高港区13477346464: 关于Thread类的start方法 -
阚乔皮肤: 看一下Thread类的源码,也许你就能搞清楚为身么文档里这样解释.这是Thread类的run()方法的代码.一目了然如果target存在的话执行target的run()方法,否则什么也不做.这样我们可以推测(因为Thread 实际运行的方法start0 是native...

高港区13477346464: 多线程问题:为什么无法调用Thread类的start方法? -
阚乔皮肤: 我来帮你解决把..虽然我不明白你为什么说无法调用Thread类的start方法.. 首先,你要理解多线程实现的2种方法.1.继承Thread类并覆写run方法 2.实现runnable接口并覆写run方法.其中这两种方法中在实际开发和应用中只有第...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网