java第24天(线程的创建,线程中的常用方法,线程阻塞,守护线程,线程同步异步,并发问题)
多线程
线程的创建方式
- 继承Thread类
- 实现Runnable接口
实现Runnable接口后重写run()方法
注意:创建线程的时候还是需要new Thread对象
- 匿名内部类创建
创建Thread匿名内部类的方法
创建Runnable匿名内部类(这个匿名内部类实现的是接口,接口中没有start()方法,所以还需要创建一个Thread对象,然后传入匿名内部类对象)
注意:线程的启动是调用start()方法,run()方法是定义线程任务的
线程中的常用方法
- getName():获取线程名
Thread t1=new Thread();
String name=t1.getName();
System.out.println(t1);//Thread[Thread-0,5,main]
System.out.println(name);//Thread-0
- currentThread():获取当前执行的线程对象
t1=Thread.currentThread();
System.out.println(t1);//Thread[main,5,main]
System.out.println(t1.getName());//main
isDaemon():判断线程是否是守护线程
sleep(long time):线程的休眠,休眠指定time时间
yield():线程的阻塞,让线程立即进入到就绪状态(不管时间有没有执行完)
join():线程阻塞
setPriority(int num):设置线程的优先级
注意:直接打印线程会输出Thread[main,5,main]---->Thread[线程名,优先级,在哪个方法],线程的优先级分为1-10,默认是5,理论上讲,优先级越高的线程,抢到时间片的概率越高,1最低,10最高
线程的阻塞:sleep(),yield(),jion(),wait()
- sleep(long time):线程的休眠,线程在休眠time个毫秒值后,进入到就绪状态,此时有需要再次抢到时间片才会继续运行
- yield():立即让线程进入到就绪状态,不管当前线程的时间片有没有执行完,都强制进入到就绪状态
例如:sleep(2000),name该线程下次运行的时间一定是大于2000毫秒的 - join()
注意:该方法出现在哪个线程中,就阻塞谁,哪个线程调用该方法,就等该方法先执行完
守护线程:又叫后台线程,当没有前台线程的时候,后台线程会自动结束
线程名.setDaemon(true);
例如:垃圾回收器就是一个守护线程
并发
并发:多线程并发,通常是多个线程做同一件事情的时候冲突了
异步:一起执行,互相不干涉(效率高)
同步:排队,你先执行完我再执行(效率低)
如果程序造成并发,严重会直接导致系统崩溃
synchronized:锁,用于解决并发,加在方法上,让该线程在执行该方法时,谁先进来,谁就先执行,后来的需要等待
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?