2013-11-14 3 views
-1

Я работаю над чем-то как частью задания колледжа, часть того, что задают, - это симуляция сбоев потоков. для контекста я пользуюсь службой-исполнителем из Java SEИмитация отказа нити в Java

Я немного огляделся вокруг и Google, но не смог найти ничего конкретного или конкретного в том, чтобы делать что-то подобное.

Кто-нибудь знает или имеет хорошие источники информации или рекомендаций относительно того, как подойти к этому?

+9

Что вы подразумеваете под _thread failures_? –

+2

Вы имеете в виду, что ваши «Runnable» или «Callable» должны вызывать исключение, а выполнение - действие? –

+0

@SotiriosDelimanolis Мои извинения, должно быть, было яснее. Как я интерпретирую вопрос, так это то, что мне нужно как-то выполнить задачу, которая выполняется в пуле потоков, чтобы иметь случайную вероятность сбоя. Чтобы уточнить, это то, что мне дано «Имитировать провал потока и реализовать соответствующий механизм мониторинга и восстановления». Кроме того, я не ищу, чтобы кто-то выполнял мою работу, просто идеи или информацию об этом. – Eogcloud

ответ

1

Если вы хотите проверить, как потоки «провал», когда они сталкиваются исключение можно реализовать Runnable, которые вы можете командовать на провал:

public class FailingRunnable implements Runnable { 

    private volatile boolean doFail = false; 

    @Override 
    public void run() { 
     while(!doFail && ! Thread.interrupted()) 
     { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 
     } 
     throw new RuntimeException("failed"); 
    } 

    public void failOnNextOccasion() { 
     doFail = true; 
    } 

} 

Вы должны сохранить ссылку на работоспособный после добавления его исполнителю, а затем в любой момент времени вызовите метод failOnNextOccasion() вашего запуска. Как это:

ExecutorService execSrv = Executors.newFixedThreadPool(2); 

    FailingRunnable one = new FailingRunnable(); 
    FailingRunnable two = new FailingRunnable(); 

    execSrv.submit(one); 
    execSrv.submit(two); 

    try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
     Thread.currentThread().interrupt(); 
    } 

    one.failOnNextOccasion(); 
    two.failOnNextOccasion(); 
0

Чуть более сложная нить неисправной с не столь очевидной ошибкой:

public class Test { 

    static class FailerThread implements Runnable { 

    final Object[] objects; 
    final Random random; 
    final int number; 

    public FailerThread(final Object[] objects, final int number) { 
     this.objects = objects; 
     this.random = new Random(); 
     this.number = number; 
    } 

    @Override 
    public void run() { 
     final boolean isWriter = number % 2 == 0; 
     int index = random.nextInt(objects.length); 
     try { 
     while (Thread.interrupted() == false) { 
      synchronized (objects) { 
      if (isWriter) { 
       while (objects[index] == null) { 
       System.out.println(number + ": Index " + index + " is null, waiting..."); 
       objects.wait(); 
       } 
       for (int copyIndex = 0; copyIndex < objects.length; ++copyIndex) { 
       if (objects[copyIndex] == null) { 
        objects[copyIndex] = this.objects[index]; 
       } 
       } 
       objects.notifyAll(); 
      } else { 
       objects[index] = null; 
      } 
      } 

      ++index; 
      if (index >= objects.length) { 
      index = 0; 
      } 
     } 
     } catch (InterruptedException e) { 
     } 
    } 
    } 

    public static void main(String[] args) throws InterruptedException { 
    final Object[] objects = new Object[10]; 
    for (int i = 0; i < objects.length; ++i) { 
     objects[i] = new Object(); 
    } 

    final int NUM_THREADS = 32; 
    final ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS); 
    for (int i = 0; i < NUM_THREADS; ++i) { 
     executor.execute(new FailerThread(objects, i)); 
    } 
    } 
} 

Он должен терпеть неудачу немедленно, однако причиной этого является все, кроме тривиальное.

+1

Вы проверяете прерванный флаг внутри блока try для InterruptedException с пустым блоком catch. Кто установит прерванный флаг? – mwhs

Смежные вопросы