您的位置:首页 > 编程语言 > Java开发

Java多线程系列(2)--Thread中start()和run()

2017-02-20 16:53 344 查看

一、start()和run()的用处

start():用于启动一个新的线程,新线程会执行相应的run()方法,start()不能被重复使用。

run():和普通的成员方法一样,可以被重复调用。单独调用run()时,会在当前线程中执行run(),而并不会开启新的线程。

二、通过代码实例进行区分

package Test;

/**
* Created by LKL on 2017/2/20.
*/
public class TestStartAndRun {
public static void main(String[] args){
Thread mythread2 = new MyThread2("mythread2");
System.out.println(Thread.currentThread().getName()+" call mythread2.run()");
mythread2.run();

System.out.println(Thread.currentThread().getName()+" call mythread2.start()");
mythread2.start();

}
}

package Test;

/**
* Created by LKL on 2017/2/20.
*/
public class MyThread2 extends Thread {
public MyThread2(String name){
super(name);
}
public void run(){
System.out.println(Thread.currentThread().getName()+" is running");
}
}


运行结果如下:

main call mythread2.run()
main is running
main call mythread2.start()
mythread2 is running


由上述结果得到:

1>mythread2.run()是在主线程main中调用的,该run()方法直接运行在主线程main上

2>mythread2.start()会启动线程mythread2,线程mythread2启动之后,会调用run()方法,此时的run()方法是运行在线程mythread2上的。

当我将上述main函数中的代码修改成如下时,即运行多个run()方法时:

package Test;

/**
* Created by LKL on 2017/2/20.
*/
public class TestStartAndRun {
public static void main(String[] args){
Thread mythread2 = new MyThread2("mythread2");
System.out.println(Thread.currentThread().getName()+" call mythread2.run()");
mythread2.run();

System.out.println(Thread.currentThread().getName()+" call mythread2.start()");
mythread2.start();

System.out.println(Thread.currentThread().getName()+" call mythread2.run()");
mythread2.run();

System.out.println(Thread.currentThread().getName()+" call mythread2.run()");
mythread2.run();

}
}


运行结果如下:

main call mythread2.run()
main is running
main call mythread2.start()
main call mythread2.start()
main is running
main call mythread2.start()
main is running
mythread2 is running


此时的结果就有一定的不确定性。此时主线程和mythread2线程都开启了,后续优先级再进行说明。

三、线程中start()和run()方法的源码

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()启动线程。此时会新运行一个新的线程,新的线程会调用run()方法。

Thread.java中run()源码如下:

public void run() {
if (target != null) {
target.run();
}
}


由上面的代码可以得到,target是一个Runnable对象,run()直接调用线程中的Runnable成员的run()方法,并不会新建一个线程。

文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此谢过…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程 线程