Re[5]: Brian Goetz и др. Java Concurrency in Practice
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 09.08.06 13:24
Оценка: 2 (1)
Здравствуйте, 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;
        }
http://denis-zhdanov.blogspot.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.