Java多线程
⒈优点
1.提高应用程序的相应。对图形化界面更有意义,增强用户体验。
2.提高计算机系统Cpu的利用率。
3.改善程序结构,将既长又复杂的进程分为多个线程独立运行,利于理解和修改。
⒉分类
1.Java中的线程分为两类,一种是守护线程,一种是用户线程。
2.几乎他们在每个方面都是相同的,唯一的区别是判断JVM何时离开。
3.守护线程是用来服务用户线程的,通过在start()方法前调用thread.setDaemon(true)可以把一个用户线程变成一个守护线程。
4.Java中的垃圾回收就是一个典型的守护线程。
5.若JVM中都是守护线程,当前JVM将退出。
⒊线程的生命周期
1.新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。
2.就绪:处于新建状态的线程被start()后,将进入线程队列等待cpu时间片,此时它已具备了运行的条件。
3.运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态,run()方法定义了线程的操作和功能。
4.阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出cpu并临时中止自己的执行,进入阻塞状态。
5.死亡:线程完成了它的全部工作或线程被提前强制性的中止。
⒋实现
1.继承Thread接口,并重写run()方法
1 package cn.coreqi.thread; 2 3 public class MyThread extends Thread { 4 @Override 5 public void run() { 6 for(int i = 0; i< 100; i++){ 7 System.out.println("name:" + Thread.currentThread().getName() + "number:" + i); 8 } 9 } 10 }
1 public class Main { 2 public static void main(String[] args) { 3 Thread thread = new MyThread(); 4 thread.start(); 5 } 6 }
2.实现Runnable接口,并重写run()方法
1 package cn.coreqi.thread; 2 3 public class MyTask implements Runnable { 4 @Override 5 public void run() { 6 System.out.println(""); 7 } 8 }
1 public class Main { 2 public static void main(String[] args) { 3 Thread thread = new Thread(new MyTask()); 4 thread.start(); 5 } 6 }
对比继承和实现的方式,实现的方式要优于继承的方式
1.避免了java中单继承的局限性。
2.如果多个线程之间要同时操作同一份资源(或数据),更适合使用实现的方式。【仍然有线程安全问题】
⒌Thread常用方法及线程优先级
}
⒎那些情况下将会释放锁
1.当前线程的同步方法或同步代码块执行结束
2.当前线程在同步代码块或同步方法中遇到break、return终止了该代码块、该方法的继续执行
3.当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束。
4.当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。
⒏那些情况下不会释放锁
1.线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行。
2.线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)
*应尽量避免使用suspend()和resume()来控制线程。
⒐线程的死锁问题
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
解决方法:
1.专门的算法、原则
2.尽量减少同步资源的定义
⒑线程通信
1.wait():令当前线程挂起并放弃Cpu、同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问。
2.notify():唤醒正在排队等待同步资源的线程中优先级最高的结束等待。
3.notifyAll():唤醒正在排队等待资源的所有线程结束等待。
*这三个方法由Object提供,只能在同步方法或同步代码块中使用,否则抛出java.lang.IllegalMonitorStateException异常
作者:奇
出处:https://www.cnblogs.com/fanqisoft/p/10937962.html
版权:本作品采用「本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!