Слушатели и темы - PullRequest
       7

Слушатели и темы

0 голосов
/ 20 декабря 2018

Я чувствую, что это может быть глупый вопрос, но я не настолько опытен со слушателями ... В любом случае, у меня есть вопрос, касающийся потоков и слушателей;рассмотрите этот код (может быть не синтаксически правильным, делая это изо всех сил):

public class Stuff {
    private SimpleLongProperty time = new LongProperty(this, "time");
    private Executor execute;

    public Stuff(Clock clock) {
        time.bind(clock.getValue);
        execute = Executors.newFixedThreadPool(5);
    }

    public void someAction() {
        for(int i = 0; i < 5; i++) {
            execute.execute(scheduleTask());
        }
    }

    public Runnable scheduleTask() {
        time.addListener((obs, oldV, newV) -> {
            //Code here
        });
    }
}

Когда вызывается someAction () и вызывает scheduleTask () 5 раз, чтобы добавить 5 слушателей, каждый слушатель будетвыполнить код внутри собственного потока, когда время обновляется?или он выполнит код в главном потоке, поскольку там находится время?

1 Ответ

0 голосов
/ 21 декабря 2018

Был в состоянии войти на рабочую станцию, чтобы написать код и проверить его, нашел мой ответ.

public class Stuff {
    private LongProperty time = new SimpleLongProperty(this, "time");
    private Executor execute;

    public Stuff(Clock clock) {
        time.bind(clock.getValue);
        execute = Executors.newCachedThreadPool(runnable -> {
            Thread t = new Thread(runnable);
            t.setDaemon(true);
            return t;
        });
    }

    public void someAction() {
        for(int i = 0; i < 5; i++) {
            execute.execute(scheduleTask(i));
        }
    }

    public Runnable scheduleTask(int i) {
        time.addListener((obs, oldV, newV) -> {
            System.out.println("Task " + i + ": " + Thread.currentThread());
        });
    }
}

Приведенный выше код будет иметь печать:

Task 0: Thread[JavaFX Application Thread, 5, main]
Task 1: Thread[JavaFX Application Thread, 5, main]
Task 2: Thread[JavaFX Application Thread, 5, main]
Task 3: Thread[JavaFX Application Thread, 5, main]
Task 4: Thread[JavaFX Application Thread, 5, main]

Изменение someAction () и scheduleTask () работает примерно так:

public void someAction() {
    for(int i = 0; i < 5; i++) {
        scheduleTask(i);
    }
}

public void scheduleTask(int i) {
    Runnable test = () -> {
        System.out.println("Task " + i + ": " + Thread.currentThread());
    };
    time.addListener((obs, oldV, newV) -> {
        execute.execute(test);
    });
}

Будет выдавать следующее:

Task 0: Thread[Thread-16, 5, main]
Task 1: Thread[Thread-17, 5, main]
Task 2: Thread[Thread-20, 5, main]
Task 3: Thread[Thread-19, 5, main]
Task 4: Thread[Thread-18, 5, main]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...