正在使用的Java通用类

时间:2015-10-20 11:37:25

标签: java multithreading generics

很多搜索都会帮助我解决问题。 在重构大量实现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,我努力了,但都失败了。请告诉我如何解决我的问题。谢谢=)

1 个答案:

答案 0 :(得分:1)

如果你希望你的假脱机程序是通用的,你应该用你在假脱机程序的构造函数中注入的工厂来组合它

interface ConsummerFactory {
  public AbstractConsummer create();
}

所以在假脱机程序的init方法中,您调用工厂的create方法

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