Помещать вызовы методов в ArrayList? - PullRequest
1 голос
/ 15 июля 2010

Я добавлял функцию загрузки в свою программу на 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
}

Это не настоящие методы для моей программы, но они очень похожи на то, что я хочу достичь.

Я уверен, что это не лучший способ, но я хочу, чтобы у меня был какой-то способ создать такой список, чтобы я знал, сколько существует процессов, прежде чем запускать их. У меня есть система, настроенная для того, чтобы еще больше разбивать эти процессы и показывать их прогресс, так что на данный момент эта полоса довольно точная, но я должен нумеровать каждый из процессов = /.

Может быть, я просто упускаю суть. Создание индикаторов прогресса - абсолютно новое для меня.

Если есть хорошие статьи о создании индикатора выполнения, не стесняйтесь присылать их мне тоже. Имейте в виду, что я не использую настоящий графический интерфейс на основе свинга. Этот бар весь текст S.O.P.

Большое спасибо,

Юстиан Мейер

Ответы [ 2 ]

5 голосов
/ 15 июля 2010

Ожидается, что замыкания появятся в следующей версии 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();
}
2 голосов
/ 15 июля 2010

Вот схема, которая только что пришла мне в голову:

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)

Когда у вас есть работа, вы просите фабрику изготовить для вас один из этих процессов.При этом он выполняет оценку рабочих единиц и передает ее в только что созданный рабочий процесс.Он также ведет подсчет общего количества этих юнитов для настройки верхней части индикатора прогресса.Одним из приятных побочных эффектов этого является то, что вам не нужно ждать, пока все ваши задания будут подготовлены: вы можете увеличивать максимальное значение для своего отчета о ходе работы каждый раз, когда добавляете работу, даже когда работы обрабатываются и создаются заново;ваш бар всегда будет отображать реалистичное соотношение.

Вы можете поместить свои рабочие процессы в какую-то очередь.ExecutorService приходит на ум, если ваш WorkProcess также реализует интерфейс Runnable (что является хорошей идеей).Вы сможете обрабатывать эти задания последовательно по одному файлу или одновременно - независимо от того, что поддерживает механизм очереди выполнения.

Метод WorkProcess 'execute() в основном обертывает метод run() (или, возможно, другой способ).вокруг, так как ExecutorService ожидает метод run (), но наша магия рабочих единиц находится в execute());но когда это сделано, он добросовестно перезванивает на reportWorkDone с тем количеством единиц, которое ему сказали, что его работа того стоила.После получения этих отчетов у фабрики есть обновленное значение для единиц выполненной работы, о котором оно может сообщить обратно отслеживающему ProgressListener.Это, в свою очередь, обновляет панель в графическом интерфейсе.

Готово.(Я думаю).Вероятно, нуждается в доработке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...