我在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
答案 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中的栏。
完成。 (我认为)。可能需要一些改进。