Семафор против других инструментов предотвращения столкновений - PullRequest
0 голосов
/ 09 октября 2018

Я разрабатываю jar, который запускает 3 потока, как показано в описании и коде ниже.

  • Первый модуль реализует прослушиватель файла в определенном каталоге, который выполняет метод, когда файлсоздал.
  • Во втором реализован таймер, который активируется каждые 20 секунд и в зависимости от внешних обстоятельств может вставлять файл в каталог, просматриваемый первым потоком
  • Третий такжереализует таймер каждые 10 секунд, который выполняет метод, который не взаимодействует с первыми двумя.

    public class Example{
    
    public static void main(String[] args) throws Exception{
    try {
        Executor runner = Executors.newFixedThreadPool(1);
        runner.execute(new FileWatcher());
    } catch (Exception ex) {
        log.error("Error al lanzar el demonio FileWatcher", ex);
    }   
    
    int delay = 1000; // delay for 1 sec. 
    final int period = 20000;
    Timer timer = new Timer();
    final EditFile ef = new EditFile();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            ef.edit();
        }
    }, delay, period);
    
    int delay2 = 1000; // delay for 1 sec. 
    final int period2 = 10000;
    Timer timer2 = new Timer();
    final SendFile sf= new SendFile();
    timer2.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            sf.sendFile();
        }
    }, delay2, period2);
    
    }}
    

Основная проблема, с которой я сталкиваюсь, заключается в том, что первые два потока иногда мешают друг другу (поскольку они изменяют один и тот же каталог), создавая непредвиденные поведения.

Как я могу убедиться, что один процесс не запускается, если другой активен или ждет, пока он не будет завершен?

Я думал о реализации семафора, но никогда не использовал его и не знаю,это может быть лучшим подходом к моей проблеме.

...