我正在尝试将线程池中的任务排队,以便在工作人员空闲时立即执行,我发现了各种示例,但在所有情况下,这些示例都已设置为为每个作业使用一个新的 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 服务器的新连接。
任何帮助将不胜感激,因为我以前从未使用过线程,而且我现在正在兜圈子。