Thread类中的start()和run()的区别说明
start():它的作用是启动一个新的线程,新线程会执行相应的run()方法,start()不能被重复调用
run():run()就和普通的成员方法一样,可以被重复调用,单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程
下面来代码说明一下
package com.tuhu.filt.javadata;
public class MyThread extends Thread{
private int ticket = 10;
public void run(){
for(int i =0;i < 20;i++){
if(this.ticket > 0){
System.out.println(
this.getName()
+ "卖票:ticket"
+this.ticket--
);
}
}
}
}
class TicketThreadTest{
public static void main(String[] args) {
long start = System.currentTimeMillis();
MyThread t1 = new MyThread();
// MyThread t2 = new MyThread();
// MyThread t3 = new MyThread();
t1.start();
long end = System.currentTimeMillis() - start;
System.out.println("单线程执行的时间为"+end);
// t2.start();
// t3.start();
}
}
t1.start()会启动一个新的线程,并在新线程中运行run()方法
而t1.run()则会直接在当前线程中运行run方法,也就是main线程,并不会启动一个新的线程来运行run();
start()和run()的区别示例
package com.tuhu.filt.javadatathread;
public class MyThread extends Thread {
public MyThread(String name){
super(name);
}
public void run(){
System.out.println(
Thread.currentThread().getName()
+"is running"
);
}
}
class Demo{
public static void main(String[] args) {
Thread mythread = new MyThread("mythread");
System.out.println(
Thread.currentThread().getName()
+"call mythread.run()"
);
mythread.run();
System.out.println(
Thread.currentThread().getName()
+"call mythread.start"
);
mythread.start();
}
}
我们可以从上面的结果看出来 run试运行在main主线程上面的
start()启动后会调用run()方法此时是运行在mythread上的
start 和 run()方法的相关源码 基于1。7
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()启动线程的
private native void start0();
Thread.java中run()的代码如下
public void run() {
if (target != null) {
target.run();
}
}
targrt是一个Runnable()对象 run()就是直接调用Thread线程的Runnable成员的run()方法,并不会新建一个线程。也就是说我们最开始启动main线程,他会直接去判断main线程的Runnable成员的run()方法 明白了吗?