Я пытаюсь поставить в очередь задачи в пуле потоков, которые будут выполняться, как только рабочий освободится, я нашел различные примеры этого, но во всех случаях примеры были настроены на использование нового экземпляра Worker для каждого задания, я нужны настойчивые работники.
Я пытаюсь создать инструмент резервного копирования ftp, он у меня работает, но из-за ограничений одного соединения он работает медленно. В идеале я хочу иметь одно соединение для сканирования каталогов и создания списка файлов, а затем четырех рабочих для загрузки указанных файлов.
Вот пример моего рабочего FTP:
public class Worker implements Runnable {
protected FTPClient _ftp;
// Connection details
protected String _host = "";
protected String _user = "";
protected String _pass = "";
// worker status
protected boolean _working = false;
public Worker(String host, String user, String pass) {
this._host = host;
this._user = user;
this._pass = pass;
}
// Check if the worker is in use
public boolean inUse() {
return this._working;
}
@Override
public void run() {
this._ftp = new FTPClient();
this._connect();
}
// Download a file from the ftp server
public boolean download(String base, String path, String file) {
this._working = true;
boolean outcome = true;
//create directory if not exists
File pathDir = new File(base + path);
if (!pathDir.exists()) {
pathDir.mkdirs();
}
//download file
try {
OutputStream output = new FileOutputStream(base + path + file);
this._ftp.retrieveFile(file, output);
output.close();
} catch (Exception e) {
outcome = false;
} finally {
this._working = false;
return outcome;
}
}
// Connect to the server
protected boolean _connect() {
try {
this._ftp.connect(this._host);
this._ftp.login(this._user, this._pass);
} catch (Exception e) {
return false;
}
return this._ftp.isConnected();
}
// Disconnect from the server
protected void _disconnect() {
try {
this._ftp.disconnect();
} catch (Exception e) { /* do nothing */ }
}
}
Я хочу иметь возможность вызывать Worker.download(...)
для каждой задачи в очереди всякий раз, когда рабочий становится доступным, без необходимости создавать новое подключение к ftp-серверу для каждой загрузки.
Любая помощь будет оценена по достоинству, так как я никогда раньше не использовал потоки, и в данный момент я хожу по кругу.