- 多线程
在一个进程中,可以同时生成多个线程,用于并发执行相同或不同的任务操作,可以提升程序的运行效率,使CPU、内存和IO相关的资源得到充分的利用,比如一个文件读写的操作,IO耗时较长,如果这时是单线程的,那么我们需要文件读写完成才能进行其他操作,这时候CPU资源是闲置的,相反如果使用多线程,一个线程在读写文件的同时,另一个线程可以利用CPU的闲置时间进行其他的计算操作,那么整个程序运行的时间就缩短了。但是不要以为线程越多,资源的利用效率就越高,如果过多的线程反而会使程序的运行效率变低,这主要使因为过多的线程,操作系统在管理这些线程时就耗费掉了大量的资源,在总资源一样的情况下,真正用在程序本身的资源比例自然就下降了,所以程序反而变慢了,具体多少线程合适,还需看CPU的核数、IO操作和计算操作的占比,需要在实际应用的过程中进行总结优化。
示例代码请点击下载
- 线程安全
由于在一个进程中的多线程是共享资源的,比如全局变量,每个有访问权限的线程都可以对其进行操作,这在线程并发时可能造成资源占用冲突,比如两个线程都在对一个全局整型变量进行计算操作,最终的结果可能并不是我们预期的结果,这就是导致的线程不安全问题。为了解决此问题,我们需要对这种共享资源的相关操作进行上锁,即当一个线程在对共享资源进行操作时,通过上锁使其他线程在这个时间没法对共享资源进行操作,只有前一个线程完成相关的操作并释放了锁以后,其他线程才可以来操作这个资源,这样就保证的资源操作的安全性,使实际的结果与我们的预期一致。实际编程过程中,锁也有很多中,JDK中也提供了一些性能高的锁,有兴趣的同学可以搜索相关的资料进行了解,这里不具体罗列。
- 线程间通信
有时我们需要让多个线程协同工作,比如一个线程完成某个操作时,另一个线程就可以接着完成其他的操作,这时就需要在线程间建立一种通信机制,比如notify可以唤醒另一个处于wait状态的线程,具体如何使用大家可以查相关资料,在实际编程过程中去领会其要领。
- 线程示例-生产者消费者
生产者消费者是多线程中一种典型的应用,日常工作中经常会运用到这种场景,各IT大厂如华为等的基础面试中也经常出现相关的编程题目本示例使用最基本的线程同步、Notify及wait等实现最基本的生产者消费者例程,适用于Java编程初学者了解多线程、同步块、线程安全、原子操作类等基本原理和用法。
生产者:
1、模拟工厂车间生产产品,假设每n秒可以生产一个产品(这里的n为2~10秒的随机时间),产品使用product-x进行标号,x为递增序列;
2、生产完的产品堆放在一个运输线上,通知运输工人搬走,每次只能搬走一件产品。
消费者:
- 搬运工人作为产品的消费者,当有产品生产出来时,就需要立即将其从运输线上搬走,避免造成运输线积压;
- 当运输线上没有产品时,工人可以休息,等待生产者侧的通知,这样既保证了效率,又节省了资源(不需要工人一直盯着运输线看有没有产品生产出来)。
程序运行主函数:
时间格式转换工具类:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTimeUtil {
public static String getDateTimeStr(Date date) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
return format.format(date);
}
}
运行结果:
Producer: time: 2024-06-24 10:31:43.414, product: product-0
Consumer: time: 2024-06-24 10:31:43.508, product: product-0
Producer: time: 2024-06-24 10:31:45.521, product: product-1
Consumer: time: 2024-06-24 10:31:45.521, product: product-1
Producer: time: 2024-06-24 10:31:47.406, product: product-2
Consumer: time: 2024-06-24 10:31:47.406, product: product-2
Producer: time: 2024-06-24 10:31:49.405, product: product-3
Consumer: time: 2024-06-24 10:31:49.405, product: product-3
Producer: time: 2024-06-24 10:31:49.405, product: product-4
Consumer: time: 2024-06-24 10:31:49.406, product: product-4
Producer: time: 2024-06-24 10:31:50.404, product: product-5
Consumer: time: 2024-06-24 10:31:50.404, product: product-5
Producer: time: 2024-06-24 10:31:50.532, product: product-6
Consumer: time: 2024-06-24 10:31:50.532, product: product-6
Producer: time: 2024-06-24 10:31:53.417, product: product-7
Consumer: time: 2024-06-24 10:31:53.417, product: product-7
Producer: time: 2024-06-24 10:31:55.410, product: product-8
Consumer: time: 2024-06-24 10:31:55.410, product: product-8
Producer: time: 2024-06-24 10:31:57.409, product: product-9
Consumer: time: 2024-06-24 10:31:57.409, product: product-9
Producer: time: 2024-06-24 10:31:57.409, product: product-10
Consumer: time: 2024-06-24 10:31:57.409, product: product-10
Producer: time: 2024-06-24 10:31:59.546, product: product-11
Consumer: time: 2024-06-24 10:31:59.546, product: product-11
Producer: time: 2024-06-24 10:32:01.424, product: product-12
Consumer: time: 2024-06-24 10:32:01.424, product: product-12
Producer: time: 2024-06-24 10:32:02.411, product: product-13
Consumer: time: 2024-06-24 10:32:02.411, product: product-13
Producer: time: 2024-06-24 10:32:04.421, product: product-14
Consumer: time: 2024-06-24 10:32:04.421, product: product-14
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
五、示例代码请点击下载,完整代码,可独立运行。