Ind*_*igo 4 java multithreading javafx
我使用JavaFX制作了一个GUI,并且有三个单选按钮,一旦用户单击提交并创建了另一个线程,并且根据检查的单选按钮,线程运行所需的输出并将结果输出到控制台.
但是当线程正在运行时(一个进程完成需要大约30秒),我可以检查任何单选按钮.它创建另一个线程,并与其他正在进行的线程输出长.所以我的输出框只是一个混乱的混乱!我在看异步任务,但我不确定这是否与它有关.
这就是我需要的:如果一个任务正在运行,我在运行时点击提交按钮,等待上一个任务结束,然后执行任务.
这是我的代码的伪代码
class TestMain{
main class{
launch(args);
}
declaring a new textfield with name m_status update here
once submit button is clicked {
create a new thread to run
}
}
class ThreadBlahBlah implements Runnable{
if(first checkbox was selected){
//do these fancy stuff
Platform.runLater(new Runnable() {
@Override
public void run() {
TestMain.m_status_update.setText("Test Completed!") ;
}
else(second checkbox was selected){
//do these other fancy stuff
Platform.runLater(new Runnable() {
@Override
public void run() {
TestMain.m_status_update.setText("Test Completed!") ;
}
}
Run Code Online (Sandbox Code Playgroud)
请不要建议我在任务运行时禁用单选按钮,因为我想将我的任务排队,如链接列表.
使用单线程执行程序来运行您的任务:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class QueuedTaskExample extends Application {
private AtomicInteger taskCount = new AtomicInteger(0);
private ExecutorService exec = Executors.newSingleThreadExecutor(r -> {
Thread t = new Thread(r);
t.setDaemon(true); // allows app to exit if tasks are running
return t ;
});
// Use the following if you want the tasks to run concurrently, instead of consecutively:
// private ExecutorService exec = Executors.newCachedThreadPool(r -> {
// Thread t = new Thread(r);
// t.setDaemon(true);
// return t ;
// });
@Override
public void start(Stage primaryStage) {
// Just keep track of number of tasks pending/running for a status label:
IntegerProperty pendingTasks = new SimpleIntegerProperty(0);
Button startButton = new Button("Start");
TextArea textArea = new TextArea();
textArea.setEditable(true);
startButton.setOnAction(event -> {
Task<Void> task = createTask();
// add text to text area if task's message changes:
task.messageProperty().addListener((obs, oldMessage, newMessage) -> {
textArea.appendText(newMessage);
textArea.appendText("\n");
});
// for maintaining status label:
pendingTasks.set(pendingTasks.get()+1);
task.setOnSucceeded(taskEvent -> pendingTasks.set(pendingTasks.get()-1));
// run task in single-thread executor (will queue if another task is running):
exec.submit(task);
});
// layout etc
HBox controls = new HBox(startButton);
controls.setAlignment(Pos.CENTER);
controls.setPadding(new Insets(10));
Label statusLabel = new Label();
statusLabel.textProperty().bind(Bindings.format("Pending/running tasks: %s", pendingTasks));
BorderPane root = new BorderPane(textArea, statusLabel, null, controls, null);
Scene scene = new Scene(root, 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
@Override
public void stop() {
exec.shutdownNow();
}
// Trivial task that counts slowly to 5, updating its message as it goes:
private Task<Void> createTask() {
final int taskNumber = taskCount.incrementAndGet();
return new Task<Void>() {
@Override
public Void call() throws Exception {
for (int count=1; count<=5; count++) {
Thread.sleep(1000);
updateMessage("Task "+taskNumber+": Count "+count);
}
return null ;
}
};
}
public static void main(String[] args) {
launch(args);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3285 次 |
| 最近记录: |