我们知道传统创建线程的方式有两种:
一、继承Thread类,覆盖run()方法
// 继承Thread class MyThread extends Thread{ @Override public void run(){ // do something } } // 开启线程 MyThread t1 = new MyThread(); t1.start();
二、实现Runnable接口,覆盖run()方法,使用该Runnalbe对象构造Thread类
// 实现Runnable接口 Class MyRunnable implements Runnable{ @Override public void run(){ // do something } } // 开启线程 Thread t2 = new Thread(new MyRunnable); t2.start();
创建线程的方式很简单,不过多讨论,这里提两个问题:
问题1:能否run()方法中抛出InterruptedException异常,以便在run()方法中调用Thread.sleep()的时候,不用try...catch..
问题2:如果同时覆盖的Thread类的run()方法,也为该Thread传递了Runnable对象,那么程序运行Thread类的run()方法代码,还是执行Runnable对象的run()方法的代码呢?
解答:
问题1,明显不可以,代码写完连编译都不过,我们翻看Thread类的run()方法源码可知,
Thread类的run()方法并没有抛出异常,子类继承父类的run()方法
也就不能抛出异常,这是继承方面的知识,这里暂时不深入讨论。
源码:
class MyThread extends Thread{ @Override public void run() throws InterruptedException { Thread.sleep(1000L); } }
编译器提示:
问题2:我们知道不管使用那种方式创建线程,最终都会调用Thread类的run()方法,
翻看Thread类的源码可知,在Thread类的run方法中有以下这段代码:
if (target != null) {
target.run();
}
而这个targe就是我们在构造方法传入的Runnalbe类,到这里我们应该明白,
这里分两种情况:
1)情况1:如果覆盖了Thread类的run方法,并且没有在run方法中调用super.run()方法,
则程序只会执行Thread类中的run方法代码
2)情况2:如果覆盖了Thread类的run方法,并且在run方法中第一行中调用super.run()方法,
则程序先执行Runnable类中的run方法代码,之后再执行Thread类中的run方法代码。
源码:
package com.sam; /** * 传统线程回顾 * @author SAM * */ public class TraditionalThread { /** * @param args */ public static void main(String[] args) { new Thread(new Runnable() { // Runnable的fun方法 @Override public void run() { System.out.println("这是Runnable类的run方法 TName=" + Thread.currentThread().getName()); } }){ // Thread类的run方法 @Override public void run() { //super.run(); System.out.println("这是Thread类的run方法 TName=" + Thread.currentThread().getName()); }; }.start(); } }
程序执行结果:
相关推荐
资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...
01_课程回顾 02_作业题强化和野指针 03_向null地址copy数据和不断改变指针指向强化 04_有关字面量 05_间接赋值从0级指针到1级指针 06_间接赋值从1级指针到2级指针_技术推演_传智扫地僧 07_间接赋值是指针存在的最大...
1.3 回顾与展望 1.3.1 UNIX 好在哪里 1.3.2 UNIX 的误区在哪儿 1.4 本书的范围 1.5 参考文献 第2 章 进程与内核(17) 2.1 简介 2.2 模式.空间和上下文 2.3 进程抽象 2.3.1 进程状态 2.3.2 进程上下文 2.3.3 用户凭证 ...
企业级ios应用开发实战分为三部分:基础篇(1~6章),首先介绍了传统企业级应用与iOS企业级应用的区别、iOS企业级应用程序的架构以及发布方法,然后详细讲解了iOS的开发框架、Objective-C语法的核心要素、Xcode集成...
企业级ios应用开发实战分为三部分:基础篇(1~6章),首先介绍了传统企业级应用与iOS企业级应用的区别、iOS企业级应用程序的架构以及发布方法,然后详细讲解了iOS的开发框架、Objective-C语法的核心要素、Xcode集成...
23.5.2 线程 268 23.5.3 中断 269 23.5.4 操作系统 270 23.6 对GetAGrip系统建模 272 23.6.1 类 272 23.6.2 用例 274 23.6.3 交互 274 23.6.4 整体状态变化 277 23.6.5 整体部署 277 23.7 锻炼肌肉 278 23.8 小结 ...
<<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 ... 比尔....这一天 微软公司正式推出了其下一代...