`
吖龙Sam
  • 浏览: 20337 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

我们知道传统创建线程的方式有两种:

一、继承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();
	}
}

 程序执行结果:


 

 

  • 大小: 12.1 KB
  • 大小: 3.3 KB
分享到:
评论

相关推荐

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    传智播客扫地僧视频讲义源码

    01_课程回顾 02_作业题强化和野指针 03_向null地址copy数据和不断改变指针指向强化 04_有关字面量 05_间接赋值从0级指针到1级指针 06_间接赋值从1级指针到2级指针_技术推演_传智扫地僧 07_间接赋值是指针存在的最大...

    UNIX 高级教程系统技术内幕

    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应用开发实战(全部章节)

    企业级ios应用开发实战分为三部分:基础篇(1~6章),首先介绍了传统企业级应用与iOS企业级应用的区别、iOS企业级应用程序的架构以及发布方法,然后详细讲解了iOS的开发框架、Objective-C语法的核心要素、Xcode集成...

    企业级iOS应用开发实战(高清版)

    企业级ios应用开发实战分为三部分:基础篇(1~6章),首先介绍了传统企业级应用与iOS企业级应用的区别、iOS企业级应用程序的架构以及发布方法,然后详细讲解了iOS的开发框架、Objective-C语法的核心要素、Xcode集成...

    UML基础、案例与应用(第三版)].施穆勒.扫描版_2分.pdf

    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 小结 ...

    C#微软培训资料

    <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 ... 比尔....这一天 微软公司正式推出了其下一代...

Global site tag (gtag.js) - Google Analytics