zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java基础加强之并发(三)Thread中start()和run()的区别详解编程语言

JAVA基础并发编程语言 详解 区别 thread start
2023-06-13 09:20:30 时间
Thread中start()和run()的区别

start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。
run()  : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!

MyThreadTest.java代码

class MyThread extends Thread{ 

 public void run() { 

 System.out.println("线程名:"+Thread.currentThread().getName()); 

public class MyThreadTest { 

 public static void main(String[] args) { 

 MyThread mythread = new MyThread(); 

 mythread.start();//运行结果:线程名:Thread-0 

 mythread.run();//运行结果:线程名:main 

}

结果说明:
(01) Thread.currentThread().getName()是用于获取“当前线程”的名字。当前线程是指正在cpu中调度执行的线程。
(02) mythread.run()是在“主线程main”中调用的,该run()方法直接运行在“主线程main”上。
(03) mythread.start()会启动“线程mythread”,“线程mythread”启动之后,会调用run()方法;此时的run()方法是运行在“线程mythread”上。

Thread类中start()方法源码
public synchronized void start() { 

 // 如果线程不是"就绪状态",则抛出异常! 

 if (threadStatus != 0) 

 throw new IllegalThreadStateException(); 

 // 将线程添加到ThreadGroup中 

 group.add(this); 

 boolean started = false; 

 try { 

 // 通过start0()启动线程 

 start0(); 

 // 设置started标记 

 started = true; 

 } finally { 

 try { 

 if (!started) { 

 group.threadStartFailed(this); 

 } catch (Throwable ignore) { 

}

说明:start()实际上是通过本地方法start0()启动线程的。而start0()会新运行一个线程,新线程会调用run()方法。

Thread类中run源码
private Runnable target;
public void run() { if (target != null) { target.run(); }

说明:target是一个Runnable对象。run()就是直接调用Thread线程的Runnable成员的run()方法,并不会新建一个线程。

 

11147.html

cjava