2010-07-15 57 views
1

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

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

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 
} 

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

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

也许我只是缺少重点。创建进度条对我来说是全新的。

如果有任何关于进度条创建的好文章,请随时以我的方式发送给他们。请记住,我没有使用实际的基于swing的GUI。这个栏是所有S.O.P文本。

非常感谢,

瑞斯蒂昂迈耶

+0

您是否假设您的所有方法都需要等量的时间才能运行? – 2010-07-15 19:01:14

+0

我不指望他们。我基本上想把这些方法分解成相等的块。如果有5个电话,它将被分成5个区块。这些块中的每一块都将从方法中的循环中接收信息,以缓慢地填充它们。试想像这样''[///// | ///// | ///// | ///// | /////]'...................................'[///// | ///// | // ... | ..... | .....]'表示前两个过程完成并且过程3的2/5完成。当然,它看起来更像:'[//////////// 48]' – 2010-07-15 19:05:49

+0

我的创建方法并不是真的因为我喜欢干净,所以我完全接受更好的想法。 – 2010-07-15 19:08:04

回答

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(); 
} 
+0

为什么不使用Runnable或Callable(如果您需要能够抛出异常)而不是创建自己的“Job”界面。 – 2010-07-15 19:17:22

+1

彼得,我揍你了:-) – sanity 2010-07-15 19:19:03

+0

感谢编辑@Sanity。我自己在中间。我决定最初使用自定义界面来更好地说明这个想法,但是这只是增加了噪音。 – Gunslinger47 2010-07-15 19:19:11

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) 

当你有工作要做时,你可以要求工厂为你制作其中的一个工艺。这样做时,它会对工作单位进行估算,并将其传递给刚刚创建的工作流程。它还保留了这些单位的总数,以设置进度指标的顶部。这样做的一个很酷的副作用是您不必等待所有工作准备就绪:即使正在处理和新创建作业,每次添加作业时都可以增加进度报告的最大值;你的酒吧将永远显示出一个现实的比例。

您可以将您的WorkProcesses填入某种类型的队列中。 ExecutorService想到如果您的WorkProcess也实现Runnable接口(这是一个好主意)。无论您的执行队列机器支持什么,您都可以随意按顺序处理这些作业。

的WorkProcess'​​方法基本上包裹run()方法(或者倒过来,因为预计的ExecutorService一个run()方法,但我们的工作单位神奇的是在​​);但是当这样做完成后,它会认真地回电到reportWorkDone,并告知它的工作价值。在收到这些报告后,工厂已完成工作单元的更新值,可以将其报告给Snooping ProgressListener。这又会更新GUI中的栏。

完成。 (我认为)。可能需要一些提炼。