我正在javafx
中构建一个下载管理器我添加了下载按钮的功能,初始化新任务。多个下载也正在正常执行。
但我需要添加暂停和恢复功能。请告诉我们如何使用执行器来实现它。通过Executors的执行功能,任务正在启动,但我如何暂停&然后恢复它?
下面我显示我的代码的相关部分。请告诉您是否需要更多详细信息。感谢。
主要课程
public class Controller implements Initializable {
public Button addDownloadButton;
public Button pauseResumeButton;
public TextField urlTextBox;
public TableView<DownloadEntry> downloadsTable;
ExecutorService executor;
@Override
public void initialize(URL location, ResourceBundle resources) {
// here tableview and table columns are initialised and cellValueFactory is set
executor = Executors.newFixedThreadPool(4);
}
public void addDownloadButtonClicked() {
DownloadEntry task = new DownloadEntry(new URL(urlTextBox.getText()));
downloadsTable.getItems().add(task);
executor.execute(task);
}
public void pauseResumeButtonClicked() {
//CODE FOR PAUSE AND RESUME
}
}
DownloadEntry.java
public class DownloadEntry extends Task<Void> {
public URL url;
public int downloaded;
final int MAX_BUFFER_SIZE=50*1024;
private String status;
//Constructor
public DownloadEntry(URL ur) throws Exception{
url = ur;
//other variables are initialised here
this.updateMessage("Downloading");
}
@Override
protected Void call() {
file = new RandomAccessFile(filename, "rw");
file.seek(downloaded);
stream = con.getInputStream();
while (status.equals("Downloading")) {
byte buffer=new byte[MAX_BUFFER_SIZE];
int c=stream.read(buffer);
if (c==-1){
break;
}
file.write(buffer,0,c);
downloaded += c;
status = "Downloading";
}
if (status.equals("Downloading")) {
status = "Complete";
updateMessage("Complete");
}
return null;
}
}
答案 0 :(得分:0)
您可能对Concurrency in JavaFX感兴趣。
我想你也应该看一下模式Observer。
顺便说一下,我认为你不应该使用常量字符串作为状态(&#34;正在下载&#34;等),创建枚举将是一种更好的方法。
在循环中,在读/写部分周围,应该有一个同步机制,由暂停/恢复按钮控制(参见两个链接)。