第二十章 -----多线程

20.1 线程简介

计算机完全可以将多种活动同时进行,这种思想在java中称为并发,将并发完成的每一件事情称为线程

线程的特点:

极小的单位

一个进程有很多个线程

线程共享进程的资源

20.2 创建线程

20.2.1 继承Thread类

Thread类是Java.lang包中的一个类从这个类实例化的对象代表线程,启动一个新的线程需要建立Thread实例

构造方法如下

public class ThreadTest extends Thread{

}

Thread对象需要一个任务来执行

run()方法语法格式

public void run(){

}

主方法启动线程由java负责,程序员负责启动自己的线程

public static void main(String\[\] args) {

new ThreadTest().start();

}

例子:让线程循环打印1~10的数字

20.2.2 实现Runnable接口

语法:

public class Thread extends Object implements Runnable

例子:让窗口中的图标动起来

20.3 线程的生命周期

20.4 操作线程的方法

例子:每0.1s绘制一条随机颜色的线条

例子:让进度A等待进度B

20.4.3 线程的中断

例子:单击按钮停止进度条滚动

20.4.4 线程的礼让

Thread 类中提供了一种礼让方法,使用 yield0方法表示,它只是给当前正处于运行状态的线程-个提醒,告知它可以将资源礼让给其他线程,但这仅是一种暗示,没有任何一种机制保证当前线程会进入状态 。yieid()方法使具有同样优先级的线程有进入可执行状态的机会,在当前线程放弃执行权时会再度回到就绪状态。

线程的优先级

例子:观察不同优先级的线程执行完毕顺序

20.6 线程的同步

在单线程程序中,每次只能做一件事情,后面的事情需要等待前面的事情完成后才可以进行,但

是如果使用多线程程序,就会发生两个线程抢占资源的问题,如两个人同时说话、两个人同时过同一个独木桥等。所以,在多线程编程中需要防止这些资源访问的冲突。Java 提供了线程同步的机制来防止资源访问的冲突。

20.6.1 线程的安全

实际开发中,使用多线程程序的情况很多,如银行排号系统、火车站售票系统等。这种多线程的程序通常会发生问题,以火车站售票系统为例,在代码中判断当前票数是否大于0,如果大于0则执行将该票出售给乘客的功能,但当两个线程同时访问这段代码时(假如这时只剩下一张票),第一个线程将票售出,与此同时第二个线程也已经执行完成判断是否有票的操作,并得出票数大于0的结论,于是它也执行售出操作,这样就会产生负数。所以,在编写多线程程序时,应该考虑到线程安全问题。实质上线程安全问题来源于两个线程同时存取单一对象的数据。

例子:

20.6.2 线程的机制

例子:开发线程安全的火车售票系统

相关推荐
SL_staff29 分钟前
从邮箱传文档到协同流重构:企业文档协作的系统性破局实践
java·开源·github
smallyoung2 小时前
告别N+1:Spring Boot 一键数据翻译框架体系
java·后端·架构
Bazingga4 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff5 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3275 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar6 小时前
Java封装、继承、多态
java·开发语言
ly76896 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠6 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
weixin_307779136 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
奇牙coding6 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai