一.线程的基本概念
1、入题:我们大家都知道,我们可以在一台计算机上同时聊天,看电影,下载视频等,完成上述任务的各个程序之间是完全相互独立的。但是他们在同一段时间内又同时处于运行状态。当然呢,它们在这一段时间内是分时使用计算机CPU时间的。只不过呢在CPU处理速度很快,划分的时间片段很短,所以给大家感觉上是多个程序在同时运行。
2、进程:
进程是程序的一次动态执行过程。这个过程包含了从程序代码从硬盘加载到内存、在内存中执行、执行结束等过程,实际上也就是进程的产生、发展、消亡的一个过程。
另外,每个进程都有自己的独立的地址空间和占用的系统资源,在进程执行结束后,进程会释放系统资源还给系统,供其他程序使用。
3、线程:
线程是比进程更小的一个执行单位,它是一段完成特定功能的代码。
一个进程中可以包含多个线程。
与进程不同的是:同类线程将共享进程的地址空间和系统分配给进程的系统资源。线程本身并不占用资源,或者说只占用很少的一部分资源,通常只是寄存器中的数据及供程序使用的堆栈等。因此说在同一个进程的不同线程之间进行切换时,所花费的开销比在进程间切换小很多。所以,线程又被称为轻量级进程。
4、java多线程:
一个进程中可以同时运行多个线程,每个线程执行不同的任务。
5、多线程的好处:
通过多线程程序设计,就可以将程序任务划分成几个并行执行的子任务,从而提高整个程序的执行效率和系统资源的利用率
二.线程的创建方式
线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
- 调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。
- 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常
Thread类的其中的两个构造方法
实例一:在Thread子类覆盖的run方法中编写运行代码:
public class ThreadTest01 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread thread = new Thread(){
@Override
public void run(){ //覆写Thread类的run方法
int i = 0;
while(i<5){
try {
//使线程休眠1s,线程由运行状态进入阻塞状态,阻塞时间单位是毫秒
//sleep()方法是静态的,不需要特定的Thread对象就可以调用它,注意会抛出异常
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread:"+Thread.currentThread().getName());//打印当前线程的名字
System.out.println("2:"+this.getName());
i++;
}
}
};
//调用start方法启动线程:用户不能直接调用Thread类中的run方法,而是需要调用start方法间接调用run方法。
/* Thread中run方法的definition
public void run() {
if (target != null) {
target.run();
}
}
*/
thread.start();
运行结果:

实例二:在传递给Thread类的Runnable对象的run方法中编写运行代码
public class ThreadTest01 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread thread = new Thread(){
@Override
public void run(){ //覆写Thread类的run方法
int i = 0;
while(i<5){
try {
//使线程休眠1s,线程由运行状态进入阻塞状态,阻塞时间单位是毫秒
//sleep()方法是静态的,不需要特定的Thread对象就可以调用它,注意会抛出异常
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread:"+Thread.currentThread().getName());//打印当前线程的名字
System.out.println("2:"+this.getName());
i++;
}
}
};
//调用start方法启动线程:用户不能直接调用Thread类中的run方法,而是需要调用start方法间接调用run方法。
/* Thread中run方法的definition
public void run() {
if (target != null) {
target.run();
}
}
*/
thread.start();
Thread thread2 = new Thread(new Runnable(){
@Override
public void run(){ //覆写Thread类的run方法
int i = 0;
while(i<5){
try {
//使线程休眠1s,线程由运行状态进入阻塞状态,阻塞时间单位是毫秒
//sleep()方法是静态的,不需要特定的Thread对象就可以调用它,注意会抛出异常
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread2:"+Thread.currentThread().getName());//打印当前线程的名字
i++;
}
}
});
thread2.start();
}
}
运行结果:

那么大家可以思考这样两个问题:
问题一、如果Thread类的run方法被覆写了,并且为Thread类传递的Runnable对象的run方法也编写了运行代码?那么程序会执行哪一个run方法呢?
实例三:来说明上述问题
public class ThreadTest01 {
/**
* @param args
*/
public static void main(String[] args) {
new Thread(
new Runnable(){
public void run(){ //覆写Thread类的run方法
int i = 0;
while(i<5){
try {
//使线程休眠1s,线程由运行状态进入阻塞状态,阻塞时间单位是毫秒
//sleep()方法是静态的,不需要特定的Thread对象就可以调用它,注意会抛出异常
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Runnable:"+Thread.currentThread().getName());//打印当前线程的名字
i++;
}
}
}
){
public void run(){ //覆写Thread类的run方法
int i = 0;
while(i<5){
try {
//使线程休眠1s,线程由运行状态进入阻塞状态,阻塞时间单位是毫秒
//sleep()方法是静态的,不需要特定的Thread对象就可以调用它,注意会抛出异常
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("thread:"+Thread.currentThread().getName());//打印当前线程的名字
i++;
}
}
}.start();
}
}
运行结果为:

总结:在Thread子类的run方法和传递给Thread的Runnable对象的run方法都被覆写的时候,程序执行Thread子类的run方法。
问题二:如果Thread类的run方法没有被覆写,并且为Thread类传递的Runnable对象的run方法也编写了运行代码?那么程序会执行哪一个run方法呢?
总结:显然是调用Runnable对象的run方法:实例二已经证明
下一篇将讲述Thread的两种创建方法
分享到:
相关推荐
并发库高级应用\多线程\Java
张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。
Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程范围内共享...
Java 模拟线程并发是编程领域中的一个重要概念,尤其在多核处理器和高并发应用中,理解并熟练掌握线程并发技术对于提升程序性能至关重要。在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable...
本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆...
根据给定文件的信息,我们可以提炼出以下关于Java多线程与并发库的相关知识点: ### Java多线程基础 1. **线程的概念**:在Java中,线程是程序执行流的基本单元。一个标准的Java应用程序至少有一个线程,即主...
张孝祥的Java多线程与并发库高级应用笔记涵盖了从传统线程技术到JDK1.5并发库的全面内容,不仅加深了对线程基本原理的认识,还介绍了现代Java并发编程的最佳实践。对于希望提升多线程编程技能的Java开发者来说,这是...
《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...
黑马+传智 Java入门到精通视频教程+课件+代码,30套Java开发项目代码,Java多线程与并发库高级应用视频教程,及电子书,面试题,开发工具等
Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...
Java 多线程与并发理论基础 Java 多线程与并发是 Java 编程语言中的一种机制,用于提高程序的执行效率和响应速度。多线程的出现是为了解决 CPU、内存、I/O 设备速度差异的问题,通过分时复用 CPU、缓存和进程、...
在深入探讨Java多线程与并发库的高级应用前,有必要了解一些基础概念。Java线程是Java程序的基础,它代表程序中的一条执行线索或线路。在Java中创建线程有两种传统方式,一种是通过继承Thread类并覆盖其run方法来...
本篇文章将深入探讨Java中的多线程并发机制,并通过具体的示例来帮助读者更好地理解和掌握这一重要概念。 #### 二、为什么需要多线程? 多线程技术的存在主要解决了计算机系统中资源利用率低下的问题。在没有多...
Java并发库是Java编程中非常重要的一个领域,它为开发者提供了高效、安全的多线程编程工具。在《java并发库高级应用源码--张孝祥》中,我们将会深入探讨Java中的线程管理和并发控制策略,这对于我们理解和优化多线程...
本教程的焦点在于“张孝祥Java多线程与并发库高级应用视频教程”的实践代码,旨在帮助开发者深入理解并熟练掌握这些关键概念。 首先,我们要明确多线程的概念。在单处理器系统中,多线程允许程序同时执行多个任务,...