2013-04-10 2 views
0

Я использую методы wait и notify() в первый раз, и я попытался таким образом.wait and notify with condition Java

образца коды

public class Tester 
{ 
static boolean closing == false; 
static int n; 
DateTime dt = new DateTime(); 
int getMin = dt.getMinuteOfDay(); //minute of the day 
int tempMin = dt.getMinuteOfDay()+5;// minute of the day + 5 minutes 

public static void setClosing(boolean b) 
{ 
    closing = b;   
} 

public static int getN() 
{ 
    return n; 
} 

class notifier extends Thread 
{ 
    public void run() 
    { 
     synchronized(this) 
     { 
      while(getMin == tempMin || closing == true) 
      { 
       notify(); 
      } 
     } 
    } 
} 

public void starter() throws InterruptedException 
{   
    notifier nn = new notifier(); 
    while(n==1) 
    { 
     notify.start(); 
     if(closing == false) 
     { 
      synchronized(notify) 
      { 
       nn.wait(); 
       mailreader(); 
       getMin = getMin+5; 
       tempMin = tempMin+5; 
      } 
     } 
     else 
     { 
      n=2; 
     } 
    } 
} 
} 

Основной класс

public class Tester2 extends WindowAdapter 
{ 
public Tester2() 
{   
    frame = new JFrame(); 
    frame.addWindowListener(this); 
    frame.setVisible(true); 
    Tester t = new Tester(); 
    t.starter(); 
} 

@Override 
public void windowClosing(WindowEvent e) 
{ 
    Tester.setClosing(true); 
    while(Tester.getN() != 2) 
    { 
     //wait 
    } 
    frame.dispose();   
} 

public static void main(String args[]) 
{ 
    Tester2 t = new Tester2();   
}  
} 

Я зову mailreader() метода для каждого 5minutes выполнить задачу, но

, когда пользователь закрывает JFrame на Закрытие установлено в true из основного класса. Я хочу выйти из цикла while в уведомителю класс.

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

ответ

1

Если все, что вы хотите сделать, - это что-то периодически запускать в фоновом потоке, а затем отменяться упорядоченным образом, когда приложение закрывается, вам не нужно все это. Вместо этого вы можете сделать Runnable, который будет цитировать, спать и делать свое чтение почты, которое прекращается, когда прерывается (Runnable может контролировать, когда он обрабатывает прерывание, поэтому он не находится в середине чего-то). После того, как вы запустите поток, GUI сохранит ссылку на него, чтобы он мог вызвать прерывание при закрытии.

Адрес an example of how to cancel a thread using interrupt.