java多线程的创建方式

来源:互联网 发布:画画软件安卓 编辑:程序博客网 时间:2024/06/05 16:05

根据Thread类中的run方法

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

可以知道运行多线程代码有两种方式,一种是运行Thread类run方法中的代码,一种是运行target中的run代码。

方法一:运行Thread类run方法中的代码

Thread thread1=new Thread(){
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName());
                }
            }
            
        };
        thread1.start();

方法二:运行target中的run代码

target是何物,我们来追踪一下:

private Runnable target;

他是Thread类的一个Runnable参数,那么他是如何传参进来的呢?

public Thread(Runnable paramRunnable) {
        init(null, paramRunnable, "Thread-" + nextThreadNum(), 0L);
    }

通过Thread类构造方法传Runnable进来,再调用init方法

private void init(ThreadGroup paramThreadGroup, Runnable paramRunnable,
            String paramString, long paramLong) {
        init(paramThreadGroup, paramRunnable, paramString, paramLong, null);
    }

这是Thread类的一个私有初始化方法

再调用方法

private void init(ThreadGroup paramThreadGroup, Runnable paramRunnable,
            String paramString, long paramLong,
            AccessControlContext paramAccessControlContext) {

}

在这个方法里有步骤

this.target = paramRunnable;

从而给target赋值。




改方法创建改多线程方式:

Thread thread2=new Thread(new Runnable(){

            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName());
                }
            }
            
        });
        thread2.start();

那么问题又来了,如果同时存在方法一和方法二的情况,如下代码:

Thread thread3=new Thread(new Runnable(){
            @Override
            public void run() {
                while(true){
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("run:"+Thread.currentThread().getName());
                }
            }
            
        }){
            public void run() {
                while(true){
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("thread:"+Thread.currentThread().getName());
                }
            }
        };
        thread3.start();

那么该执行哪个代码呢?根据java编程思想,我们知道方法一是覆写了父类的run方法,方法二是父类固有的,所以代码在执行的时候是选择执行子类的run方法,如果子类run方法不存在,才去父类寻找runnable的run方法

0 0