Итак, прежде всего я создаю класс, которые будет генерировать число для заполнения в массив.
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, либо все работает в разнобой.