java多线程

Java中如何正确停止线程?

不能用stop(),

应该使用退出标志(正确退出线程)

 

interrupt():中断线程,并不能正确停止线程

 

volatile保证了线程可以正确的读取其他线程写入的值。

 

常用的方法

yield();使用此方法,当执行到它的时候,当前线程就会释放对cpu的执行权,但是下一刻,对CPU的执行权可能又被它抢到,也可能被其他线程抢到

setName():设置线程名字

 join():调用此方法,所有的线程等待当前线程执行完才执行

当i==20时,强制让子线程进来,直到子线程完全执行完,才会执行主线程

isAlive();判断线程是否还存活

sleep():显示的让当前线程睡眠

设置线程的优先级

getPriority():返回线程优先值

setPriority(int new Priority):设置线程优先级,1,5,10

设置线程的优先级并不是说设置的优先级越高,他就先执行,只能说是提高可它限制性的概率

 

 

实例:

  实现三个窗口售票,票数要设置为静态的(因为是继承Thread,使用实现Runnable就不用),这样三个窗口才能共用100张,

使用继承Thread

 

使用实现Runnable

 

当涉及到共享的时候,使用实现Runnable接口会更好,java是单继承,所以实现Runnable可以避免单继承

上面用继承和实现的方式实现抢票都存在线程安全的情况(重票问题),需要进行处理,因为多个线程操作同一个数据,一个线程还没有执行完,另外一个线程就参与进来,没有加锁的话会出现线程安全问题

 

多线程的优点

1,提高程序的响应,对图形化更有意义,可憎前用户体验,

2,提高计算机系统的CPU的利用率

3,改善程序结构,将长又复杂的进程分为多个线程,独立运行,立于理解和修改

 

Java种的线程可分为两类:守护线程和用户线程

1.它们几乎每个方面都是相同的,唯一的区别就是判断JVM何时离开

2.守护线程是用来服务用户线程的,通过在start()方法前调用thread.setDaemon(trur)可以把一个用户变成一个守护线程

3.java垃圾回收就是一个典型的守护线程。

4.若jvm中都是守护线程,当前jvm将退出

 

线程的生命周期

 

死锁:

  不同的线程分别占用对方的同步资源不放弃,都在等待对方放弃自己需要的资源,就形成了线程的死锁

解决方法:

  1.专门的算法,原则

  2.尽量减少同步资源的定义,同步资源越多,越容易发生死锁

 

线程的通信

wait(),notify(),notifyAll()

wait():令当前的线程挂起并放弃CPU执行权,同步资源,让别的线程可以访问并修改共享资源,而当前线程排队等候在此对资源的访问

notify():唤醒正在排队等候同步资源的线程中优先级最高者结束等待

notifyAll():唤醒正在排队等待资源的所有线程结束等待

java.lang.Object提供了这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则会报java.lang.illegalMonitorStateException异常

实现两个线程交叉打印1-100;

 

生产者和消费者的的问题

posted @   苏格拉的底牌  阅读(199)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示