Java多线程(单例模式,堵塞队列,定时器)详解
简介
Java多线程对于Java程序员而言是非常重要的一个概念。Java天生支持多线程的并发操作,因此Java开发人员需要掌握多线程知识来提高程序的并发性和性能。
本文将重点介绍Java中多线程相关的三个重要概念:单例模式、阻塞队列和定时器。
单例模式
单例模式是一种常见的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在多线程情况下,需要加锁来保证单例的懒加载和线程安全。
下面是一个单例模式的示例代码:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在上述代码中,使用了synchronized关键字来保证线程安全。通过getInstance()方法获取单例对象。
阻塞队列
阻塞队列是Java并发编程中非常重要的一种数据结构。阻塞队列能够在多线程并发的情况下实现线程间无锁同步,极大提高了并发性能。
Java 5中提供了阻塞队列,包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等。其中,最常用的是LinkedBlockingQueue。
下面是一个阻塞队列的示例代码:
public class BlockingQueueTest {
public static void main(String[] args) throws InterruptedException {
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(10);
for (int i = 1; i <= 20; i++) {
int finalI = i;
new Thread(() -> {
try {
String s = "item-" + finalI;
queue.put(s);// 阻塞式的添加元素
System.out.println("添加元素:" + s);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
//等待队列满(队列容积为10),生产者线程才能继续添加元素
Thread.sleep(1000);
while (true) {
String s = queue.poll(1, TimeUnit.SECONDS);//等待1s看是否队列中有元素
if (s == null) {
break;
}
System.out.println("移除元素:" + s);
}
}
}
在上述代码中,创建一个容量大小为10的LinkedBlockingQueue,向其中添加20个元素,每个元素添加间隔为随机的1-3s,因此队列会一直处于等待添加状态。
我们使用队列的poll()方法来获取队列中的元素,当队列为空时,会等待1s,直到有元素加入队列。
定时器
定时器是Java中非常常用的一个API,能够实现指定时间后执行某个任务的功能。Java中常用的定时器包括Timer和ScheduledThreadPoolExecutor。
下面是一个ScheduledThreadPoolExecutor定时器的示例代码:
public class TimerTest {
public static void main(String[] args) {
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);
executor.schedule(() -> System.out.println("时间到了"), 5, TimeUnit.SECONDS);
executor.scheduleWithFixedDelay(() -> {
System.out.println("Fixed Delay:" + new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}, 1, 3, TimeUnit.SECONDS);
}
}
在上述代码中,我们创建了一个ScheduledThreadPoolExecutor定时器,其中包含两个定时任务。第一个任务会在5s后执行,第二个任务会在1s后执行,之后每隔3s执行一次。其中第二个任务会休眠1s。
总结
本文介绍了Java中的三个重要概念,包括单例模式、阻塞队列和定时器。通过本文的学习,可以帮助Java开发人员更好地理解多线程编程中的常见概念,并能够运用到实际开发中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程(单例模式,堵塞队列,定时器)详解 - Python技术站