Многопоточность java, работа с классом
У меня есть переменная volatile static int number , с её помощью один из потоков counter1 увеличивает её на 1, а второй поток printer1 печатает значение этой переменной. Но по заданию мне нужно создать класс storage, который будет хранить значение переменной увеличенной в потоке counter1, а затем поток printer1 должен считывать значение этой переменной из класса storage. Я не совсем понимаю как мне сделать так, что бы переменная записывалась в классе storage,а поток принтер считал из неё значение. Сейчас у меня принтер считает значение переменной из потока counter1
public class Main {
volatile static int number = 0;
public static void main(String[] args) {
Thread printer = new Thread( new Printer1());
printer.start();
Thread counter = new Thread( new Counter1());
counter.start();
}
static class Counter1 implements Runnable{
public void run(){
System.out.println("Счётчик начинает считать");
starCounter();
}
private synchronized void starCounter(){
try{
while (number < 50) {
number++;
System.out.println("считаем значение");
Thread.sleep(1000);
}
}catch (InterruptedException exc){
System.out.println("Поток " + Thread.currentThread().getName() + " был прерван");
}
}
}
static class Printer1 implements Runnable{
@Override
public void run() {
System.out.println("ПРИНТЕР НАЧИНАЕТ ПЕЧАТАТЬ");
starPrinter();
}
private synchronized void starPrinter(){
int localNumber = number;
while ( number < 50){
if ( localNumber != number){
System.out.println("ПЕЧАТАЕМ " + number);
localNumber = number;
}
}
}
}
}
Ответы (1 шт):
Нельзя просто так записывать значение переменной в одном потоке и читать в другом. Для этого существует понятие Atomic, то есть атомарной переменной. То есть в один и тот же момент времени в нее можно или только читать или только писать. volatile вас не спасет.
Надо сделать что-то типа:
class Storage {
AtomicInteger counter=new AtomicInteger(0);
public int getCounter() {
return counter.get();
}
public int incrementCounter() {
return counter.incrementAndGet();
}
}
Теперь там где вы делаете инкремент, надо вставить storage.incrementCounter(), предварительно надо задекларировать класс Storage типа Storage storage=new Storage();