java多线程 run start 区别

了解run start 的区别首先需要了解Thread类

start方法:

  

public synchronized void start() {
        /**
         *  threadStatus  线程只能启动一次
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* 
         *  加入线程组
         */
        group.add(this);

        boolean started = false;
        try {
            //开启线程   start0() 是一个nactive方法调用底层代码开启线程 
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

start0 方法:


//start0 被声明为native 调用底层代码,也就是说只有调用了start0 这个方法才会开启一个新的线程
private native void start0();

run方法:


    //run 方法中并未调用start0  因此并未开启新的线程,只相当于普通的方法调用,即调用target的run方法
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
   
   //target 可查看Thread的构造函数
   public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }
    

启动线程:


public class TestStartRun {
    public static void main(String[] args) {
        Thread t  = createThread();
        //t.run();
        //t.start();
        System.out.println("Thread"+Thread.currentThread());
    }
    public static Thread createThread(){
        Thread t = new Thread(){
            @Override
            public void run() {
                System.out.println("Thread"+Thread.currentThread());
            }
        };
        return t;
    } 
     

调用:t.run();
ThreadThread[main,5,main]
ThreadThread[main,5,main]

调用:t.start();
ThreadThread[main,5,main]
ThreadThread[Thread-0,5,main]

总结:run方法相当于简单的方法调用并没有开启一个新的线程,start方法,相当于调用start0(),调用底层代码去开启线程
posted @ 2018-02-22 09:46  xiaofei001  阅读(188)  评论(0)    收藏  举报