我们知道传统创建线程的方式有两种:
一、继承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_间接赋值是指针存在的最大...
在本文中,作者首先回顾了现有的平滑度评价算法,如Jerkiness算法,然后在此基础上提出了一种新的多线程实现策略。新算法不仅考虑了视频的运动信息,还利用Linux系统的线程管理功能,确保了算法的实时性和计算密集型...
首先,让我们回顾一下传统的Java多线程创建方式: 1. **实现Runnable接口**:这是最基础的方式,创建一个实现了Runnable接口的类,然后在run()方法中定义线程要执行的任务。例如: ```java public class TestThread...
传统的同步阻塞I/O模型,每个请求对应一个进程或线程,当请求数量增大时,会导致大量的上下文切换、资源浪费和性能瓶颈。 为了解决C10K问题,主要关注两个核心挑战:一是如何在一个线程内处理多个网络I/O请求,二是...
### 服务器产品年度回顾 #### 一、引言 随着2011年的到来,回顾过去一年中,尽管全球经济回暖的呼声不断,信息技术行业依旧保持着稳步发展的势头。尤其是在服务器领域,各大厂商纷纷推出了多款创新型产品和技术解决...
首先,"lecture1 cuda introduction 2008.ppt"涵盖了CUDA的基础知识,包括CUDA的诞生背景、架构以及相对于传统CPU的优势。CUDA将GPU视为一个可编程的设备,由多个流处理器(Streaming Multiprocessors, SMs)组成,...
相比于传统的CGI或者FastCGI,mod_python将Python解释器嵌入到Apache中,减少了进程间的通信开销,从而提升了响应速度和整体效率。 二、mod_python 3.3.1版本 "mod_python-3.3.1.win32-py2.5-Apache2.2.exe"是针对...
在深入探讨异步开发框架之前,我们先来回顾一下传统的同步阻塞模式存在的主要问题: 1. **并发请求数受限**:每个连接都需要一个独立的线程来进行处理,导致处理能力受限。 2. **连接数受限**:对于大规模并发连接...
与传统IO相比,NIO的最大特点是支持非阻塞模式,即在进行读写操作时,线程可以选择不等待操作完成而去做其他事情。这极大地提高了并发性能,尤其是在处理大量连接请求时。 ### Java IO 与 Java NIO 的具体区别 ###...
传统线程技术回顾 - Java中的线程可以通过继承`Thread`类或实现`Runnable`接口来创建。 ##### 2. 传统定时器技术回顾 - 定时器(`Timer`)类可以用来定期执行任务。 ##### 3. 传统线程互斥技术 - 线程间的互斥通常...
传统的下载方式通常采用单线程,速度受限于网络环境。而FlashGet通过将大文件分割成多个部分,同时进行下载,显著提升了下载速度,尤其是在网络条件不稳定的情况下,多线程下载能有效避免因某个部分下载失败而导致...
NIO引入了选择器(Selector)和通道(Channel)的概念,允许单线程同时处理多个连接,提高了服务器的并发性能。例如,使用Selector可以监控多个SocketChannel,当某个通道准备好进行读写时,Selector会通知应用程序...
编译回顾中提到,编译是将高级语言转换为机器语言的过程,包括词法分析、语法分析、语义分析、生成中间代码和代码优化五个阶段。代码优化是为了提高程序运行效率,包括时间效率(减少运行时间)和空间效率(减少内存...
在传统的同步代码中,当执行一个耗时的操作,如网络请求或大文件读取时,程序会阻塞在该操作上,直到完成。这会导致用户界面无响应,因为这些操作通常在主线程上运行,而主线程负责处理UI交互。例如,在上面的`...