很多搜索都会帮助我解决问题。 在重构大量实现Producer-Consumer模式的代码时,我遇到了一个简单组合的问题。
在重构结束时,我们有一个非常简单的结构
1)一个类假脱机程序,它包含消费者线程。
2)一个抽象类AbstractConsumer,它包含一些实际的方法和变量以及一个抽象方法run();
3)子类 - 真正的消费者,它们扩展了AbstractConsumer并覆盖了run()方法。
class Spooler {
private int spoolSize = 100;
private Consumer[] spool = null;
//private ArrayList<? extends Consumer> spool = null;
//...
public Spooler() {
init();
}
public final void init() {
if (spool == null) {
spool = new ArrayList<Consumer>();
for (int i = 0; i < spool.size(); i++) {
spool.add(new Consumer(null, null));
spool[i] = new Consumer();
spool[i].start();
}
}
}
}
public abstract class AbstractConsumer extends Thread {
//some NOT ABSTRACT variables and methods
@Override
public abstract void run();
}
class XmlConsumer extends Consumer {
@Override
public void run() {
//consume current task
}
}
所以,我想要的。当我需要一些多线程数据处理时,我实现了当前的Consumer,覆盖了抽象超类的run()方法。实现新的后台处理程序,构造函数必须得到当前的消费者。然后我认为它必须全部工作。
我不知道如何在没有实现其抽象方法的情况下将AbstractConsumer添加到Spoolers ArrayList中。像那样
for (int i = 0; i < spool.size(); i++) {
spool.add(new AbstractConsumer() {
@Override
public void run() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
})
}
我认为,需要在这里使用Java Generics Classes,我努力了,但都失败了。请告诉我如何解决我的问题。谢谢=)
答案 0 :(得分:1)
如果你希望你的假脱机程序是通用的,你应该用你在假脱机程序的构造函数中注入的工厂来组合它
interface ConsummerFactory {
public AbstractConsummer create();
}
所以在假脱机程序的init
方法中,您调用工厂的create
方法
然后,如果你想要一个XmlConsumer
假脱机程序,你只需要实现一个ConsummerFactory
create
方法创建一个XmlConsummer
并将其作为你的构造函数的参数给出假脱机程序