JAVAFX:线程停止/启动

问题描述 投票:0回答:1

我的应用程序当前正在连接到Web服务以获取要在应用程序中使用的数据。我正在尝试对此进程进行处理,以便getWebServiceData()方法每隔X秒触发一次。我认为我的问题是我正在尝试使用相同的WebServiceConnect实例重新启动新线程,但我想不出任何其他方式...任何人都可以帮我构建这个,以便复选框可以终止线程,在重新调整时会创建一个新的?

我可以轻松启动线程,一旦终止它就重新启动它。我想用一个复选框来实现这个目的:

WebServiceConnect类:

public class WebServiceConnect extends Thread {

    private Boolean runThread = true;

    public Boolean getRunThread() {
        return runThread;
    }

    public void setRunThread(Boolean runThread) {
        this.runThread = runThread;
    }

    //the run method comes from the thread class.
    //allows code to be ran in the background.
    public void run() {
        System.out.println("Starting web service thread......");
        try {
            Thread.sleep(6000);
            while(runThread) {
                getWebServiceData();
                System.out.println("The data has been refreshed.");
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(WebServiceConnect.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("terminating thread.....");
            return;
        } catch (IOException ex) {
            Logger.getLogger(WebServiceConnect.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

主类:

public class CourseworkThree extends Application {

    private static final List<String> strings = Arrays.asList("2011", "2012", "2013");
    private BarChart BarChart1;
    private CheckBox[] checkBoxesYear;
    WebServiceConnect wsc = new WebServiceConnect();

    @Override
    public void start(Stage primaryStage) throws IOException {
        wsc.start();

        HBox HBox1 = new HBox();
        HBox1.setPadding(new Insets(10, 10, 10, 10));
        HBox1.setSpacing(10);

        //A checkbox with a string caption
        CheckBox cb2 = new CheckBox("Refresh Data?");
        cb2.setSelected(true);
        HBox1.getChildren().add(cb2);

        cb2.setOnAction((event) -> {
            if(!cb2.isSelected()) {
                wsc.setRunThread(false);
                wsc.interrupt();
                System.out.println("You have stopped refreshing data automatically.");
            } else {
                wsc.setRunThread(true);
                wsc.start();

            }
        }); 
java multithreading javafx-8
1个回答
2
投票

Java FX提供处理此类事物的服务。

例如。

private class KeepSessionAliveService extends ScheduledService<Void> {
        @Override
        protected Task<Void> createTask() {
            return new Task<Void>() {
                @Override
                protected Void call() throws WhatEverException {
                    //Call your code.
                    return null;
                }
            };
        }
    }

然后设置你的时间。

private void startPolling() {
        service = new KeepSessionAliveService() ;
        service.setPeriod(Duration.minutes(6));
        service.setDelay(Duration.minutes(6)); //If you want to wait before starting it.

        service.setOnSucceeded(event -> Platform.runLater(() -> {
            //reset back to FX Thread??
        }));

        service.start();
    }

这将安排您的线程以预定义的间隔运行。它将运行FX线程,因此它不会影响您的UI。如果您关闭应用程序,服务将自行关闭。我在我的应用程序中使用它来保持我与服务器的会话活着 - 就像一个魅力。

© www.soinside.com 2019 - 2024. All rights reserved.