2012-03-22 4 views
2

Я разрабатываю приложение в java, которое запускает некоторые потоки, которые выполняют некоторые задания, и обновляет JTable с помощью JProgressBar. я JPopupMenu развивать на JTable, который имеет некоторые JMenuItem:Как остановить, приостановить, отменить поток в java

  • Пауза
  • Stop
  • Отменить
  • RESUME

Так я хочу, чтобы быть в состоянии сделать это.

Когда пользователь добавить новый поток в JTable я сохранить поток в ArrayList<Thread>, так что я должен реализовать

stop.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 

      } 
     }); 

и другой ..

так я стараюсь, с гипотезой, что у меня есть индекс текущего потока:

Thread t = working.get(selectedThread); //where working is my `ArrayList<Thread>` 
t.interrupt(); 

но ничего .. это продолжать работать ... так я стараюсь:

try { 
         working.get(actualRow).wait(); 
        } catch (InterruptedException ex) { 
         Logger.getLogger(PannelloRicerca.class.getName()).log(Level.SEVERE, null, ex); 
        } 

, но поймите меня IllegalStateMonitorException на wait(), поэтому я не знаю, как это сделать .. может кто-то мне помочь?

+0

Чтобы вызвать ожидание, вам нужно иметь объект work.get (actualRow).Именно по этой причине вы получаете исключение IllegalStateMonitorException. wait может вызываться из синхронизированного блока или синхронного метода. Вместо того, чтобы использовать вызов прерывания в потоке, отправьте уведомление потоку, установив некоторую переменную потока. И в потоке использовать это значение, чтобы остановить выполнение – Delta

ответ

1

Thread.interrupt() вызова только устанавливает битые прерывания на Thread и это вызывает какие-либо wait или sleep звонков бросить InterruptedException. Он не отменяет выполнение потока, как многие ожидают.

Вы можете проверить бит прерывания в потоке, как это:

while (!Thread.currentThread().isInterrupted()) { 
    ... 
} 

Типичный способ для людей, чтобы остановить поток должен иметь AtomicBoolean (или volatile boolean) и сделать что-то вроде:

AtomicBoolean running = new AtomicBoolean(true); 
while (running.set()) { 
    ... 
} 

... 
// then in the other thread (like the main thread) you stop the thread by: 
runner.set(false); 

Вы получаете IllegalStateMonitorException, потому что вы звоните wait, не находясь внутри блока для объекта, которого вы ждете. Вам нужно сделать что-то вроде:

Thread t = working.get(actualRow); 
synchronized (t) { 
    t.wait(); 
} 

Хотя я не уверен, что это то, что вы хотите. Может быть, вы хотите присоединиться к теме, которая ждет ее завершения?

working.get(actualRow).join(); 
+0

, проблема в том, что задания моего i-потока (i означает, что есть много потоков, которые работают togheter) заключается в анализе некоторой html-страницы внутри двух вложенных циклов. так где я могу поставить ваше состояние? – JackTurky

+0

Какова цель @Jack? Вы пытаетесь остановить обработку этой html-страницы? Вы, очевидно, можете делать, если так часто. – Gray

+1

нет .. я не объяснил хорошо .. у меня есть Jpanel, в котором у меня JTable и JComboBox. пользователи могут выбрать объект в JCombobox, а затем щелкнуть по JButton можно запустить поток. Этот поток сначала обновляет JTable, добавляя строку, внутри которой есть некоторый текст и JProgressBar (управляется потоком, только что запущенным), затем анализирует многие изменения html-страницы на каждой странице, некоторый текст и значение JProgressBar внутри строки, только что вставленной в JTable , Пользователи могут запускать много потоков и, щелкая правой кнопкой мыши на строке JTable, показывают JPopupMenu, описанную в моем сообщении. – JackTurky

1

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

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

synchronize (working.get(actualRow)) { 
    working.get(actualRow).wait(); 
} 
+0

, он блокирует всю нить таким образом. – JackTurky

+0

извините .. он блокирует все GUI – JackTurky

+0

Только один из ваших потоков может находиться в синхронизированном разделе данного объекта. Если вы выполняете синхронизацию в объекте, другой поток пытается синхронизировать с одним и тем же объектом, второй будет остановлен, пока первый не покинет синхронизированный блок. Это и есть цель синхронизации. Если вы хотите просто подождать, не блокируя проблемы, синхронизируйте каждый поток с помощью другого объекта (только что созданного объекта или даже самого собственного объекта Thread). – SJuan76

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