Я сейчас что-то программирую, где у меня есть несколько экземпляров объекта, работающего в разных потоках.Я хочу иметь синхронизированный метод, который может одновременно выполнять только один экземпляр объекта.Я знаю, что ключевое слово synchronized
не будет работать, поскольку оно работает только для одного экземпляра объекта, и создание целого метода static
на самом деле не вариант.В настоящее время я использую static
boolean
, который Threads проверяет, занят ли метод вместе с вызовом метода Thread.sleep()
.Это выглядит следующим образом:
while(occupied){
Thread.sleep(randomGenerator.nextInt(1000) + 500);
}
occupied = true;
int bufferLength = outputBuffer.size();
System.out.println(name + "Size=" + outputBuffer.size());
System.out.print(name + ": ");
for(int i=0; i<bufferLength; i++){
System.out.print(outputBuffer.take().get("Order Number") + ",");
}
System.out.println("\n" + name + " is finished.\n");
occupied = false;
boolean
occupied
- это статическая переменная, которая используется совместно для 4 экземпляров моего объекта.
Это дает мне желаемые результаты, но я чувствуюнапример, перевести потоки в спящий режим на случайное количество времени - это грязный способ получить желаемый результат, и при этом у него очень небольшой шанс ошибиться.Есть ли более чистый способ сделать это?
Последнее замечание: это если я впервые публикую здесь, так что если есть что-то, что я сделал не так, пожалуйста, дайте мне знать.
edit: немного исправил код