`
吖龙Sam
  • 浏览: 20888 次
  • 性别: 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_间接赋值是指针存在的最大...

    Linux下多线程的视频图像平滑度评价算法 (1).pdf

    在本文中,作者首先回顾了现有的平滑度评价算法,如Jerkiness算法,然后在此基础上提出了一种新的多线程实现策略。新算法不仅考虑了视频的运动信息,还利用Linux系统的线程管理功能,确保了算法的实时性和计算密集型...

    利用Lambda表达式创建新线程案例

    首先,让我们回顾一下传统的Java多线程创建方式: 1. **实现Runnable接口**:这是最基础的方式,创建一个实现了Runnable接口的类,然后在run()方法中定义线程要执行的任务。例如: ```java public class TestThread...

    35C10K和C1000K回顾1

    传统的同步阻塞I/O模型,每个请求对应一个进程或线程,当请求数量增大时,会导致大量的上下文切换、资源浪费和性能瓶颈。 为了解决C10K问题,主要关注两个核心挑战:一是如何在一个线程内处理多个网络I/O请求,二是...

    服务器产品年度回顾.docx

    ### 服务器产品年度回顾 #### 一、引言 随着2011年的到来,回顾过去一年中,尽管全球经济回暖的呼声不断,信息技术行业依旧保持着稳步发展的势头。尤其是在服务器领域,各大厂商纷纷推出了多款创新型产品和技术解决...

    CUDA PPT 教程

    首先,"lecture1 cuda introduction 2008.ppt"涵盖了CUDA的基础知识,包括CUDA的诞生背景、架构以及相对于传统CPU的优势。CUDA将GPU视为一个可编程的设备,由多个流处理器(Streaming Multiprocessors, SMs)组成,...

    mod_python-3.3.1.win32-py2.5-Apache2.2.exe

    相比于传统的CGI或者FastCGI,mod_python将Python解释器嵌入到Apache中,减少了进程间的通信开销,从而提升了响应速度和整体效率。 二、mod_python 3.3.1版本 "mod_python-3.3.1.win32-py2.5-Apache2.2.exe"是针对...

    异步开发框架

    在深入探讨异步开发框架之前,我们先来回顾一下传统的同步阻塞模式存在的主要问题: 1. **并发请求数受限**:每个连接都需要一个独立的线程来进行处理,导致处理能力受限。 2. **连接数受限**:对于大规模并发连接...

    java io 与java nio区别

    与传统IO相比,NIO的最大特点是支持非阻塞模式,即在进行读写操作时,线程可以选择不等待操作完成而去做其他事情。这极大地提高了并发性能,尤其是在处理大量连接请求时。 ### Java IO 与 Java NIO 的具体区别 ###...

    java加强笔记

    传统线程技术回顾 - Java中的线程可以通过继承`Thread`类或实现`Runnable`接口来创建。 ##### 2. 传统定时器技术回顾 - 定时器(`Timer`)类可以用来定期执行任务。 ##### 3. 传统线程互斥技术 - 线程间的互斥通常...

    flashget-1.0.3-0_cn.tar.gz

    传统的下载方式通常采用单线程,速度受限于网络环境。而FlashGet通过将大文件分割成多个部分,同时进行下载,显著提升了下载速度,尤其是在网络条件不稳定的情况下,多线程下载能有效避免因某个部分下载失败而导致...

    基于Java回顾之网络通信的应用分析

    NIO引入了选择器(Selector)和通道(Channel)的概念,允许单线程同时处理多个连接,提高了服务器的并发性能。例如,使用Selector可以监控多个SocketChannel,当某个通道准备好进行读写时,Selector会通知应用程序...

    基于多核程序优化技术PPT课件.pptx

    编译回顾中提到,编译是将高级语言转换为机器语言的过程,包括词法分析、语法分析、语义分析、生成中间代码和代码优化五个阶段。代码优化是为了提高程序运行效率,包括时间效率(减少运行时间)和空间效率(减少内存...

    浅谈Async和Await如何简化异步编程(几个实例让你彻底明白)

    在传统的同步代码中,当执行一个耗时的操作,如网络请求或大文件读取时,程序会阻塞在该操作上,直到完成。这会导致用户界面无响应,因为这些操作通常在主线程上运行,而主线程负责处理UI交互。例如,在上面的`...

Global site tag (gtag.js) - Google Analytics