将方法调用放入ArrayList?

时间:2010-07-15 18:57:17

标签: java arrays methods progress-bar process

我在Java程序中添加了一个加载栏功能,我想知道是否可以设置需要完成的进程列表,以便知道需要完成多少进程。

例如,将它们保存为字符串?

ArrayList<String> processes = new ArrayList<String>();
processes.add("CSVWriter.createFileOfCompany(\"Random Company\");");
processes.add("FileConverter.convertCSVToXLS(classPath + 
    \"/Output/Random_Company.csv\");");

for (int i = 0; i < processes.size(); i++) {
    // run process
    // update loading bar
}

这些对我的程序来说不是真正的方法,但它们与我想要完成的工作非常相似。

我确定这不是最好的方法,但我希望能有一些方法来创建这样的列表,所以我知道在运行之前有多少个进程。我有一个系统设置来进一步分解这些过程并显示它们的进度,所以此栏目非常精确,但我必须为每个进程编号= /。

也许我只是错过了这一点。创建进度条对我来说是全新的。

如果有关于进度条创建的任何好文章,请随时将其发送给我。请记住,我没有使用基于摆动的实际GUI。这个栏都是S.O.P文本。

非常感谢,

Justian Meyer

2 个答案:

答案 0 :(得分:5)

有望在下一版本的Java中即将推出闭包,但在此之前,您可以使用实现已知接口的匿名类:

List<Runnable> jobs = new ArrayList<Runnable>();

jobs.add(new Runnable() {
    public void run() {
        CSVWriter.createFileOfCompany("Random Company");
    }
});

jobs.add(new Runnable() {
    public void run() {
        FileConverter.convertCSVToXLS(classPath + "/Output/Random_Company.csv");
    }
});

for (Runnable job : jobs) {
    job.run();
}

答案 1 :(得分:2)

这是我想到的一个方案:

interface WorkProcess
    void setWorkUnits(int units)
    void setArguments(Object obj1,...)
    void execute()

因此,您根据经典命令模式使用execute的接口封装所有任务;它也被告知(见下文)这项工作可能需要多少工作。您可能需要一些机制将数据传递到这些任务中以供它们使用。

class WorkProcessFactory
    static WorkProcess makeWorkProcess()
    static int getTotalWorkUnitsAllocated()
    static synchronized int reportWorkDone(int units)
    static void addProgressListener(ProgressListener xxx)

当你有工作要做时,你要求工厂为你制作这些流程之一。在这样做时,它对工作单元进行估算并将其传递给刚刚创建的WorkProcess。它还保留了用于设置进度指示器顶部的单元总数的计数。这样做的一个很酷的副作用是您不必等待准备好所有作业:即使正在处理和新创建作业,您也可以在每次添加作业时增加进度报告的最大值;您的栏将始终显示实际比率。

您可以将WorkProcesses填充到某种队列中。如果您的WorkProcess也实现了ExecutorService接口(这是一个好主意),我会想到Runnable。您可以自由地按顺序单个文件或并发地处理这些作业 - 无论您的执行队列机器支持什么。

WorkProcess'execute()方法基本上包装run()方法(或者反过来,因为ExecutorService需要run()方法,但我们的工作单元魔法在execute()) ;但是当它完成后,它会认真地回复reportWorkDone,告知其工作值得的单位数量。收到这些报告后,工厂会为已完成的工作单元更新一个值,它可以向snooping ProgressListener报告。反过来,这会更新GUI中的栏。

完成。 (我认为)。可能需要一些改进。