多线程
方式一:创建一个类继承thread类,重写run方法。
调用start方法启动,注意不能调用run方法,否则只是一个线程,而非多线程。
start方法底层是给cpu当前线程,然后出发run方法。
建议先创建子线程,主线程任务放在后面,否则主线程永远先执行。
api
getName实例方法
currentThead静态方法
sleep 休眠多少毫秒再执行
public MyThead (String name){
super(name)}
子线程调用父类构造器
方式二 实现runnable接口
缺点:稍微复杂一点;不能得到线程的返回值
优点:线程任务类只是实现了runnable接口,可以继承其他类,实现其他接口
同一线程任务可以被包装成多个线程对象
适合多个线程去共享同一个资源
实现解藕操作,线程任务代码可以被多个线程共享,线程任务代码和线程独立
线程池可以放入runnable对象callable对象
注意Thead类实现了runnable接口。
方式三 实现callable接口
创建一个线程任务类实现callable接口
创建一个callable的线程对象
callrable call = new myCallable()
把callrable对象包装成一个未来任务对象,再把它包装成线程对象;未来任务对象就是一个runnable对象,这样就可以被包装成线程对象。未来任务对象可以在线程执行完成后得到执行结果
Thead t =new FetureTask(task)
用task.get()获取线程执行结果
解决线程安全问题 通过加锁,让多个线程先后依次访问
线程同步 同步代码块,每次只能一个线程进入执行完毕后自动解锁,其它线程才可以访问
synchronized(锁对象){
//访问共享资源的核心代码块
}
原则上,锁对象唯一即可,建议使用共享资源作为锁对象。
实例方法建议用this,静态方法建议用类名.class
同步方法
直接在方法名前加上synchronized,底层与同步代码块一样
lock 显示锁
总结:线程安全性能差;线程不安全性能好。假如开发中不会存在线程安全问题,建议使用线程不安全的设计类。
StringBuilder 线程不安全
StringBuffer 线程安全(淘汰了)
线程状态
new new线程对象
runnable 调用start方法 就绪(没有得到cpu),运行(抢到cpu)状态
blocked 锁阻塞
wait 放锁后,无限等待(等待唤醒后抢锁)
timedWait 即时等待 sleep()不放锁
teminated
线程池(核心思想是线程的复用)
一个容纳多个线程的容器,其中的线程可以重复使用。
省去频繁创建和销毁线程对象的操作,导致的消耗过多资源。
ExecutorService pools = Executors.NewFixedTheadPool(3)
Runnalbe target = New MyRunnable()
pools.submit(target)
callable做线程池的任务
Feture泛型 t1 =pools.submit(new MyCallable())
t1.get()获取执行结果。
并发编程下,多线程修改变量,会出现线程间变量的不可见性。
不可见性的原因是:每个线程都有自己的工作内存,线程都是从主内存拷贝共享变量的副本值。每个线程都是在自己的工作内存中操作共享变量。
解决方案
枷锁syncronized 让线程同步,因为加锁后会清空工作内存,从主内存中找最新值。
变量用volatile修饰 变量变更后,主内存通知其它线程让原始值失效并获取最新值,实现线程间变量访问不可见性。但是它不保证原子性(一批操作是一个整体,要么同时成果,要么同时失败,不能被干扰)。
保证原子性,可以加锁,但性能差;可以使用原子类,性能高效,线程安全。
AtomicInteger原子性Integer类 底层是CAS(compare and swap)比较再交换机制,当比较值被改变后,此次操作作废。
CAS乐观锁和Synchnozied悲观锁
线程的join方法可以等待一个线程执行完毕
并发下HashMap线程不安全,并发包ConCurrentHashMap
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix