使用中的 Java 泛型类

标签 java multithreading generics

很多搜索都无法帮助我解决我的问题。 在重构大量实现生产者-消费者模式的代码时,我遇到了一个简单组合的问题。

在重构结束时我们有一个非常简单的结构

1) 一个 Spooler 类,用于调度消费者线程。

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 
        }
    }

所以,我想要的。当我需要一些多线程数据处理时,我意识到当前的消费者,覆盖抽象父类(super class)的 run() 方法。实现新的 Spooler,其构造函数必须获取 currentConsumer。然后所有它必须工作,我想。

我不知道如何在不实现其抽象方法的情况下将 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 泛型类,我努力尝试,但都失败了。请告诉我如何解决我的问题。谢谢 =)

最佳答案

如果你想让你的假脱机程序是通用的,你应该将它与你注入(inject)假脱机程序构造函数的工厂组合起来

interface ConsummerFactory {
  public AbstractConsummer create();
}

因此在后台处理程序的 init 方法中,您调用工厂的 create 方法

然后如果你想要一个 XmlConsumer 的假脱机程序,你只需要实现一个 ConsummerFactory,它的 create 方法创建一个 XmlConsummer 并将其作为后台处理程序构造函数的参数

关于使用中的 Java 泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33235603/

相关文章:

java - 使用@ElementCollection、@MapKeyJoinColumn 进行多对多关系时引用关键问题

java - 在 Eclipse 中的 GaeNature、Google App Engine 中运行构建器时出错

Java 不使用所有可用的 CPU

Swift Generic Type Equatable 通过排序数组

Java - 为参数化泛型类获取比 "Class<?>"更具体的类型

java - 可以推荐哪些 Java 原生编译器?

java - 同时调用/运行同步方法

c# - 多线程加载xml文件到内存

c++ OpenMP每个循环中的多个线程

c# - 动态排序函数