java多线程系列基础篇03-----Thread中的start()和run()的区别

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()方法 明白了吗?

猜你喜欢

转载自blog.csdn.net/lsm18829224913/article/details/81414515