没有合适的资源?快使用搜索试试~ 我知道了~
第14章 多线程前面我们写的程序都是单线程的,它们都只有一条顺序执行流:程序从main方法开始执行,依次向下执行每行代码,如果程序执行某行代码遇到了阻塞,则程序
资源详情
资源评论
资源推荐
第 14 章 多线程
前面我们写的程序都是单线程的,它们都只有一条顺序执行流:程序从 main 方法开始
执行,依次向下执行每行代码,如果程序执行某行代码遇到了阻塞,则程序将会停滞在该处。
如果我们使用 Eclipse 等 IDE 工具的单步调试功能将可以非常清楚地看出这一点。
多线程听上去是非常专业的概念,但其实非常简单:单线程的程序只有一条执行路径,
多线程的程序则包含多条执行路径,多条执行路径之间互不干扰,例如:
举例说明:
(1)单线程:
一旦前面的车,阻塞了,后面的车只能一直等待
(2)多线程:
其中一条车道阻塞了,不影响其他车道
Java 语言提供了非常优秀的多线程支持,程序可以非常简单的方式来启动多线程,通过
本章的学习,大家将会 get 到 Java 多线程编程的很多技能,包括创建、启动、控制线程,以
及多线程的同步、通信操作,还可以通过线程池提高多线程性能。
14.1 线程概述
14.1.1 进程
几 乎 所 有 操 作 系 统 都 支 持 进 程 的 概 念 , 所 有 运 行 中 的 任 务 通 常 对 应 一 条 进 程
(Process)。当一个程序进入内存运行,即变成一个进程。进程是处于运行过程中的程序,
并且具有一定独立功能,进程是操作系统进行资源分配和调度的一个独立单位。
一般而言,进程包含如下三个特性:
独立性:进程是操作系统进行资源分配和调度的一个独立单位,每一个进程都拥有自己
私有的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其
他进程的地址空间。哪怕在同一台计算机上运行,进程之间通信可能也需要通过网络、
独立于进程的文件来交换数据。
动态性:程序只是一个静态的指令的集合,而进程是一个正在系统中运行的活动的指令
集合,即进程是处于运行过程中的程序。在进程中加入了时间的概念,进程具有自己的
生命周期和各种不同状态,这些概念在程序中都是不具备的。
并发性:多个进程可以在单个处理器上并发执行,多个进程之间不会相互影响。
现代的操作系统都支持多进程的并发,但在具体的实现细节上可能因为硬件和操作系统
的不同而采用不同的策略,目前大多数采用效率更高的抢占式多任务策略。对于一个 CPU
而言,它在某个时间点上只能执行一个程序,也就是只能运行一个进程,CPU 不断的在这些
进程之间轮换执行。那么,我们为什么可以一边用开发工具写程序,一边听音乐,一边还上
网查资料.....,我们没有感觉到中断和轮换呢?这是因为 CPU 的执行速度相对于我们的感知
速度来说实在是太快了,所以我们感觉像是同时运行一样。但是当我们启动足够多的程序时,
依然可以感觉到运行速度下降的。
14.1.2 线程
多线程则扩展了多进程的概念,使得通一个进程可以同时并发处理多个任务。线程
(Thread)也被称为轻量级进程。就像进程在操作系统中地位一样,线程在进程中也是独立
的、并发的执行流。当进程被初始化后,主线程就被创建了,对于 Java 程序来说,main 线
程就是主线程,但我们可以在该进程内创建多条顺序执行路径,这些独立的顺序执行路径就
是线程。
进程中的每一个线程可以完成一定的任务,并且是独立的,线程可以拥有自己独立的堆
栈、自己的程序计数器和自己的局部变量,但不再拥有系统资源,它与父进程的其他线程共
享该进程所拥有的全部资源。由于线程间的通信是在同一个地址空间上进行的,所以不需要
额外的通信机制,这就使得通信更简便而且信息传递的速度也更快,因此可以通过简单编程
实现多线程相互协同来完成进程所要完成的任务。但是也存在安全问题,因为其中一个线程
对共享的系统资源的操作都会给其他线程带来影响,由此可知,多线程中的同步是非常重要
的问题。
线程的执行也是抢占式的,也就是说,当前运行的线程在任何时候都可能被挂起,以便
另一个线程可以运行。我们说 CPU 在不同的进程之间轮换,进程又在不同的线程之间轮换,
因此线程是 CPU 执行和调度的最小单元。
总之,一个程序运行后至少有一个进程,一个进程里可以包含多个线程,但至少要包含
一个线程。当操作系统创建一个进程时,必须为该进程分配独立的内存空间,并分配大量的
相关资源;但创建一个线程简单的多,而且多个线程共享同一个进程的虚拟空间,所以,使
用多线程来实现并发比使用多进程实现并发的性能要高的多。
在实际应用中,多线程是非常有用的,一个 Web 服务器必须能同时响应多个客户端的
请求;一个浏览器必须能同时下载多个图片;一个在线播放器必须能一边下载一边播放......
注意:
并发性(concurrency)和并行性(parallel)是两个概念,并行是指在同一时刻,有多条指令
在多个处理器上同时执行;并发是指在同一个时刻只能有一条指令执行,但多个进程的指令
被快速轮换执行,使得在宏观上具有多个进程同时执行的效果。
14.2 线程的创建和启动
Java 使用 Thread 类代表线程,所有的线程对象都必须是 Thread 类或其子类的对象。每
个线程的作用是完成一定的任务,实际上就是执行一段代码,我们称之为线程执行体。Java
使用 run 方法来封装这段代码,即 run 方法的方法体就是线程执行体。
14.2.1 继承 Thread 类创建线程类
通过继承 Thread 类来创建并启动多线程的步骤如下:
(1)定义继承 Thread 的子类,并重写该类的 run()。查看 Thread 类的源代码,发现当
我们没有传 target 时,那么 Thread 类的 run()就是一个什么也没干的方法,因此我们必须重
写 run()来完成线程的任务。
public void run() {
if (target != null) {
target.run();
}
}
(2)创建 Thread 子类的实例,一个实例对象就是一个线程。
(3)调用线程对象的 start()来启动线程。
示例代码:
package com.atguigu.part01.thread;
public class TestMyThread {
public static void main(String[] args) {
MyThread my1 = new MyThread();
my1.start();
MyThread my2 = new MyThread();
my2.start();
for (int i = 10; i >= 1; i--) {
System.out.println(Thread.currentThread().getName() + "线程:" + i);
}
}
}
class MyThread extends Thread{
public void run(){
for (int i = 1; i <= 10; i++) {
System.out.println(super.getName() + "线程:" + i);
}
}
}
说明:
Thread.currentThread()方法总是返回当前在执行的线程对象;
getName()方法是 Thread 的实例方法,该方法返回当前线程对象的名字,可以通过
提示:
(1)JavaSE 的程序至少有一个 main 主线程,它的方法体即是线程体。
(2)Thread-0 和 Thread-1 线程虽然都是 MyThread 类的线程对象,但是各自调用自己的
run(),互相之间是独立的,因此各打印 1-10。
(3)启动线程用 start()方法,而不是 run()!调用 start()方法来启动线程,系统会把该 run()
方法当成线程执行体来处理。但是如果直接调用 run(),系统会把线程对象当成一个普通对
象,而 run()就是一个普通方法。
setName(String name)方法设置线程名称,否则依次为 Thread-0,Thread-1......等
14.2.2 实现 Runnable 接口
实现 Runnable 接口来创建并启动多线程的步骤:
(1)定义 Runnable 接口的实现类,并重写该接口的 run()方法
(2)创建 Runnable 实现类的对象
(3)创建 Thread 类的对象,并将 Runnable 实现类的对象作为 target。其实该 Thread
类的对象才是真正的线程对象。当 JVM 调用线程对象的 run()时,如果 target 不为空,就会
调用 target 的 run()。
public void run() {
if (target != null) {
target.run();
}
}
(4)调用线程对象的 start()启动线程。
示例代码:
package com.atguigu.part01.thread;
public class TestMyRunnable {
public static void main(String[] args) {
MyRunnable my = new MyRunnable();
new Thread(my).start();
new Thread(my).start();
for (int i = 10; i >= 1; i--) {
System.out.println(Thread.currentThread().getName() + "线程:" + i);
}
}
剩余52页未读,继续阅读
英次
- 粉丝: 20
- 资源: 306
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0