Java 语言 多线程设计模式的3个技巧 Future/观察者/生产者 消费者

Java阿木 发布于 2025-06-25 4 次阅读


Java多线程设计模式:Future、观察者、生产者-消费者模式

在Java编程中,多线程设计模式是处理并发问题的有效手段。本文将围绕Future、观察者和生产者-消费者三种设计模式,探讨它们在Java多线程编程中的应用。

一、Future模式

Future模式是一种用于异步编程的设计模式,它允许调用者在任务执行完毕后获取结果。在Java中,Future接口及其实现类(如FutureTask)是实现Future模式的关键。

以下是一个使用Future模式的简单示例:

java

import java.util.concurrent.;

public class FutureExample {


public static void main(String[] args) {


ExecutorService executor = Executors.newCachedThreadPool();


Future<String> future = executor.submit(new Callable<String>() {


@Override


public String call() throws Exception {


// 模拟耗时操作


Thread.sleep(2000);


return "Hello, Future!";


}


});

try {


// 获取异步任务的结果


String result = future.get();


System.out.println(result);


} catch (InterruptedException | ExecutionException e) {


e.printStackTrace();


}

executor.shutdown();


}


}


在这个例子中,我们创建了一个线程池,并提交了一个Callable任务。通过Future对象,我们可以在任务执行完毕后获取结果。

二、观察者模式

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。在Java中,可以使用Observer接口及其实现类来实现观察者模式。

以下是一个使用观察者模式的示例:

java

import java.util.;

interface Observer {


void update(String message);


}

class Subject {


private List<Observer> observers = new ArrayList<>();


private String message;

public void addObserver(Observer observer) {


observers.add(observer);


}

public void removeObserver(Observer observer) {


observers.remove(observer);


}

public void notifyObservers() {


for (Observer observer : observers) {


observer.update(message);


}


}

public void changeMessage(String message) {


this.message = message;


notifyObservers();


}


}

class ConcreteObserver implements Observer {


@Override


public void update(String message) {


System.out.println("Received message: " + message);


}


}

public class ObserverExample {


public static void main(String[] args) {


Subject subject = new Subject();


ConcreteObserver observer1 = new ConcreteObserver();


ConcreteObserver observer2 = new ConcreteObserver();

subject.addObserver(observer1);


subject.addObserver(observer2);

subject.changeMessage("Hello, Observer!");


subject.removeObserver(observer1);


subject.changeMessage("Goodbye, Observer!");


}


}


在这个例子中,Subject类维护了一个观察者列表,当Subject的状态发生变化时,它会通知所有观察者。ConcreteObserver类实现了Observer接口,并在update方法中处理接收到的消息。

三、生产者-消费者模式

生产者-消费者模式是一种用于解决生产者和消费者之间同步问题的设计模式。在Java中,可以使用BlockingQueue来实现生产者-消费者模式。

以下是一个使用BlockingQueue实现的生产者-消费者模式的示例:

java

import java.util.concurrent.;

class Producer implements Runnable {


private BlockingQueue<Integer> queue;

public Producer(BlockingQueue<Integer> queue) {


this.queue = queue;


}

@Override


public void run() {


try {


for (int i = 0; i < 10; i++) {


queue.put(i);


System.out.println("Produced: " + i);


Thread.sleep(1000);


}


} catch (InterruptedException e) {


e.printStackTrace();


}


}


}

class Consumer implements Runnable {


private BlockingQueue<Integer> queue;

public Consumer(BlockingQueue<Integer> queue) {


this.queue = queue;


}

@Override


public void run() {


try {


while (true) {


Integer number = queue.take();


System.out.println("Consumed: " + number);


Thread.sleep(1000);


}


} catch (InterruptedException e) {


e.printStackTrace();


}


}


}

public class ProducerConsumerExample {


public static void main(String[] args) {


BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();


ExecutorService executor = Executors.newCachedThreadPool();

executor.submit(new Producer(queue));


executor.submit(new Consumer(queue));

executor.shutdown();


}


}


在这个例子中,我们创建了一个BlockingQueue作为生产者和消费者之间的通信通道。生产者将整数放入队列,消费者从队列中取出整数。通过使用BlockingQueue,我们实现了生产者和消费者之间的同步。

总结

本文介绍了Java多线程编程中的三种设计模式:Future、观察者和生产者-消费者。这些模式在处理并发问题时非常有用,可以帮助我们编写更高效、更可靠的代码。在实际项目中,我们可以根据具体需求选择合适的设计模式,以提高代码的可读性和可维护性。