Являются ли объекты Task- Runnable-, Thread-, Timeline поточно-ориентированными? - PullRequest
0 голосов
/ 06 мая 2019

У меня есть объекты Task-, Thread-, Timeline в качестве атрибутов в моем приложении. И несколько потоков имеют к ним доступ. Должен ли я синхронизировать доступ?

код для объекта потока:

public class CalculationThread {
    private Thread thread = new Thread("Clct") {
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.print("\n" + i);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    break;

                }
            }
            return;

        }
    };
    private Thread interruptingThread = new Thread("Intrpt") {
        public void run() {
            try {
                Thread.sleep(7000);
            } catch (InterruptedException e) {
                return;
            }
            System.out.println("\nInterrupting thread:" + getName());
            thread.interrupt();
        }
    };


    public static void main(String[] args) {
        CalculationThread cthr= new CalculationThread();
        cthr.thread.start();
        cthr.interruptingThread.start();
    }
}    

Итак, атрибут потока запускается здесь главным потоком и прерывается прерываниемThread-attrubute. Итак, поток-объект кажется потокобезопасным в подобных ситуациях, или?

1 Ответ

0 голосов
/ 06 мая 2019

VGR, но этот код показывает, что временная шкала все еще может использоваться в другом потоке:

public class FillingTimeLine extends Application {
private LongProperty lp = new SimpleLongProperty(0);
private Timeline timeline = new Timeline();

@Override
public void start(Stage primaryStage) throws Exception {
    // TODO Auto-generated method stub
    System.out.println("\nSTARTING THREAD: " + Thread.currentThread().getName());
    StackPane spane = new StackPane();
    ProgressBar pb = new ProgressBar(0);
    pb.setMinSize(160, 21.5);
    pb.setMaxSize(160, 21.5);
    pb.setPrefSize(160, 21.5);

    pb.progressProperty()
            .bind(lp.divide(10000 * 1.0));  
    pb.setStyle("-fx-base:darkgray;-fx-accent:red;");
    spane.getChildren().add(pb);
    Scene scene = new Scene(spane, 300, 300);
    primaryStage.setScene(scene);
    primaryStage.show();
    startFilling();
    stopFilling();


}

public void startFilling() throws InterruptedException {
    new Thread(() -> {
        System.out.println("\nSTARTING THREAD: " + Thread.currentThread().getName());
        timeline = new Timeline(new KeyFrame(Duration.seconds(0), new KeyValue(lp, 0)),
                new KeyFrame(Duration.seconds(10), new KeyValue(lp, 10000)));
        if (Thread.currentThread().isInterrupted()) {
            System.out.println("\n THR WAS INTERRUPTED!");
            return;
        }

        timeline.play();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            System.out.println("\n THR WAS INTERRUPTED!");
            return;
        }

    }).start();

}

public void stopFilling() {
new Thread(() -> {
        System.out.println("\nSTOPPING THREAD: " + Thread.currentThread().getName());
        try {
            Thread.sleep(4000);
            timeline.stop();
        } catch (InterruptedException e) {
            return;
        }

    }).start();
}
public static void main(String[] args) {
    launch(args);
}

}
Или я ошибаюсь?

...