博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程run方法执行顺序
阅读量:3959 次
发布时间:2019-05-24

本文共 2380 字,大约阅读时间需要 7 分钟。

总结:线程执行start()的时候,会先执行自己的run()方法,只有当自己的run()为空的时候,才会去执行父类的runnable

先看一道题:以下多线程执行的结果是什么?

new Thread(                new Runnable() {                    @Override                    public void run() {                        while (true) {                            try {                                Thread.sleep(2000);                            } catch (InterruptedException e) {                                e.printStackTrace();                            }                            System.out.println("1");                        }                    }                }        ) {            @Override            public void run() {                while (true) {                    try {                        Thread.sleep(2000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println("2");                }            }        }.start();

看这个之前,我们先看一下java中,Thread是怎么实现run方法的。

我们先看第二张图,当target(Runnable)不为空的时候,run方法才会被执行。

Thread 实现Runnable接口

Thread 重写run方法

我们把上面代码精简一下,可以得到如下代码:

new Thread(runnable.run()){               run()            }.start();

首先 Thread执行start()的时候,会先去执行自己的run()方法,只有当自己的run()为空的时候,才会去执行父类的runnable,因此上文被执行的是System.out.println("2"); 父类此时被子类覆盖了。

new Thread(runnable.run()){   //只有当自己的run()为空的时候才会被执行            run()     //第一个被执行        }.start();

多线程的两种方式

  • 继承Thread
  • 实现 Runnable接口

//Thread的子类        Thread thread = new Thread() {            @Override            public void run() {                while (true) {                    try {                        Thread.sleep(2000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println(Thread.currentThread().getName());                }            }        };        thread.start();

//第二个线程 实现Runnable        Thread thread2 = new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    try {                        Thread.sleep(2000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    System.out.println(Thread.currentThread().getName());                }            }        });        thread2.start();

注意:

以上为Demo,只演示代码,但是会造成死循环。

转自 

转载地址:http://xoazi.baihongyu.com/

你可能感兴趣的文章
POJ---3662(Telephone Lines,最短路+二分*好题)
查看>>
L2-007. 家庭房产(并查集)
查看>>
L2-016. 愿天下有情人都是失散多年的兄妹(搜索)
查看>>
L2-019. 悄悄关注
查看>>
POJ 3468 A Simple Problemwith Integers(SplayTree入门题)
查看>>
营业额统计 HYSBZ - 1588 (伸展树简单应用)
查看>>
HDU 1890 Robotic Sort(伸展树---反转应用)
查看>>
POJ 3580 SuperMemo(伸展树的几个基本操作)
查看>>
(十) Web与企业应用中的连接管理
查看>>
(八) 正则表达式
查看>>
一.JavaScript 基础
查看>>
7.ECMAScript 继承
查看>>
HTML DOM
查看>>
AJAX 基础
查看>>
JSON 基础
查看>>
J2EE监听器Listener接口大全[转]
查看>>
cookie、session、sessionid 与jsessionid[转]
查看>>
常见Oracle HINT的用法
查看>>
JAVA中各类CACHE机制实现的比较 [转]
查看>>
PL/SQL Developer技巧
查看>>