@thatmaniscool

Как синхронизировать поток в Java?

Итак, прежде всего я создаю класс, которые будет генерировать число для заполнения в массив.
public class IntegerGenerator {
	private static volatile int SerialGenerator = 0;
	public static int SerialNumber (){
		return SerialGenerator ++;
	}
}

После чего создается другой метод для работы с массивом, все методы помечены как синхронизированные.
public class MyMethods {
	private static int [] array;
	private static int size;
	private static int index = 0;
	
	// Инициализация
	public MyMethods (int size){
		this.size = size;
		array = new int [size];
		for (int i=0; i!=size; i++)
			array[i] = -1;
	}
	
	// Добавление нового значение в массив.
	public static synchronized void add (int value){
		array[index] = value;
		index = ++index % size;
	}
	// Проверка совпадения в массиве.
	public static synchronized boolean isConstain (int value){
		for (int i=0; i!=size; i++)
			if (array[i] == value)
				return true;
		return false;
	}
	
	// Показать весь массив.
	public static synchronized void ShowArray (){
		for (int i=0; i!=size; i++)
			System.out.println ("array[" + i + "] is: " + array[i]);
	}

}

И еще один класс для заполнения и редактирования этого массива.
public class MainClass {
	private static MyMethods MM = new MyMethods (1000);
	private static ExecutorService exec = Executors.newCachedThreadPool();
	
	// Внутренний класс
	public static class MyWork implements Runnable {
		public void run (){
			while (true){
				int value = IntegerGenerator.SerialNumber(); // Получаем значение от переменной.
				if (MM.isConstain(value)){
					System.out.println ("Dublicate serial: " + value); // если есть дубликаты, выводим сообщение
					System.exit(0);// и выходим
				}
				else
					MM.add(value); // если нет совпадения, добавляем значение в массив.
			}
		}
	}
	
	public static void main (String [] args){
		for (int i=0; i!=3; i++)
			exec.execute(new MyWork ()); // создаем три потока, которые будут поочередно работать с массивом.
			exec.shutdown();
		MM.ShowArray(); //  показать массив.
	}
}

Как я понимаю, потоки должны запускаться последовательно, сначала обрабатывается первый поток до завершения, потов второй, третий и т.д.
В результате значения в массиве должны достигать 3.тысяч.
Но потоки не сихронизируется, и в результате либо все -1, либо все работает в разнобой.
  • Вопрос задан
  • 262 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽