【Java进阶】多线程编程(一)
本文对Java的多线程进行简单介绍和入门。
1. 什么是多线程?
多线程编程,就是让机器在实现代码时,做到同步执行代码。对于JVM来讲,这些代码的底层可能不是同时运行的,但从表面上看,他们是同时的。合理地使用多线程代码,可以使得程序执行更加高效。
2. 多线程的用途
在执行图片下载,文档写入等操作时,如果数量比较大,可以使用多线程编程,让这些操作同时进行,从而避免for循环的低效。
3. Java实现多线程的方式
Java代码从底层就支持多线程,实现多线程的方法也比较简单,使用Thread类,传递一个Runnable对象,就可以进行线程的操作。代码示例如下:
上述代码中,创建了两个打印当前时间的线程,并且让这两个线程同时运行,输入结果如下:
两个线程输出时间相同,即两个线程开始的时间是相同的。在这里,Thread的构造函数传递的是一个Runnable对象,在Java中,Runnable是一个给定的接口,只有一个run()方法。所以传递的对象需要实现Runnable接口和run()方法,也可以使用lambda表达式,写起来更加简洁。(关于lambda表达式的各种用法,后续给出汇总)
当然,实现多线程还有另外一种方式,就是继承Thread类,并且重写run()方法,在Java源码中,Thread类也是实现了Runnable接口的。示例如下:
4. 多线程编程的注意事项
多个线程同时访问一个对象时,可能会造成线程不安全的问题,即某一个线程正在读取,但另一个线程已经写入等操作,造成和想要的结果不一致的问题,比如下面的操作:
创建10000个线程,每个线程都是对count进行加一,然后让这些线程同时启动,得到的结果却比10000小,这是因为可能存在多个线程同时读取了count的原始值,同时进行加一,即进行加一的次数不满10000次。可以用以下办法解决:
一是实现数字的原子性,即采用原子数进行操作,具体实现如下:
这里需要注意的是,在输出最终结果前,要对线程进行sleep()操作,否则会使得线程为进行完毕,就直接输出,结果也是不对的。
二是使用Lock方法,在进行某个操作时,先将该方法上锁,直到执行完毕释放锁,才能再次被执行。
第三种方法是使用synchronized关键字,对操作进行修饰,即可保证在访问期间,线程是加锁的,不能被其他线程访问,代码如下:
synchronize关键字在java源码中被频繁使用,可以用来实现线程安全的操作,Object类的方法中有wait()方法可以暂时释放锁,notify()方法唤醒正在等待的线程,后续文章继续探讨。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix