Здравствуйте, mik1, Вы писали:
M>Посмотрите внимательно на то, как поля инициализированы в конструкторе, и на то, в каком порядке их устанавливает setter. Речь идет именно о переупорядочивании операций.
правильно ли я понимаю, что ты имеешь ввиду, что когда в setter() сначала инициализируется int, потом boolean, авторы считают, что этот порядок противоположен? С моей точки зрения там беда в том, что поля объявлены без модификатора volatile.
M>Ну и добавил код гашения потока пула потоков executor-а (не понимаю, почему не гасится сам).
Потому что имеем:
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(1); // (1)
Runnable task = new Runnable() {
public void run() {
}
};
executor.submit(task); // (2)
}
В (1) создается объект ThreadPoolExecutor;
Следовательно, в (2) имеем стек вызова:
AbstractExecutorService.submit(Runnable task)
|
ThreadPoolExecutor.execute(Runnable command)
|
ThreadPoolExecutor.addIfUnderCorePoolSize(Runnable firstTask)
|
ThreadPoolExecutor.addThread(Runnable firstTask)
|
DefaultThreadFactory.newThread(Runnable r)
где уже находится ответ
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}