Первый вариант: поле "factoryNumber " просто инкрементируется в конструкторе (строка 10), затем значение поля вызывается в строке 16.
В итоге- номер этого поля в консоль выводится постоянно "2" (что неправильно)
public static class AmigoThreadFactory implements ThreadFactory {
private static AtomicInteger factoryNumber = new AtomicInteger(0);
private AtomicInteger threadNumber = new AtomicInteger(0);
private ThreadGroup threadGroup;
private String namePrefix;
public AmigoThreadFactory() {
SecurityManager s = System.getSecurityManager();
threadGroup = Thread.currentThread().getThreadGroup();
factoryNumber.getAndIncrement();
}
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(threadGroup,r, threadGroup.getName() + "-pool-" +
factoryNumber.get()+"-thread-"+ threadNumber.incrementAndGet());
thread.setDaemon(false);
thread.setPriority(Thread.NORM_PRIORITY);
return thread;
}
}
}
Второй вариант: поле "factoryNumber " инкрементируется в конструкторе (строка 10) и его значение тут же заносится в поле namePrefix, которое потом юзается для имени новой нити (строка 16). В этом случае, как и требуется, номер поля "factoryNumber " в консоль выводится то 1, то 2.
public static class AmigoThreadFactory implements ThreadFactory {
private static AtomicInteger factoryNumber = new AtomicInteger(0);
private AtomicInteger threadNumber = new AtomicInteger(0);
private ThreadGroup threadGroup;
private String namePrefix;
public AmigoThreadFactory() {
threadGroup = Thread.currentThread().getThreadGroup();
namePrefix = threadGroup.getName() + "-pool-"
+ factoryNumber.incrementAndGet() + "-thread-";
}
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(threadGroup, r, namePrefix
+ threadNumber.incrementAndGet());
thread.setDaemon(false);
thread.setPriority(Thread.NORM_PRIORITY);
return thread;
}
}
Почему так? не могу понять. Подскажите кто видит, пожалуйста