Watki a sprzatanie

0

hej
mam takie teoretyczne pytanie-przykladowo stworzylam sobie watek Test, w nim, w metodzie run sa jakies tam rzeczy robione. co jakis czas watek idzie spac i pozniej na nowo sa robione akcje. sa ta akcje zwiazane (m.in) z pobieraniem maila(tzn jak pojawi sie nowy to pobiera). i teraz tak - chce zeby ten watek mi sie zamknal po kilku godzina/dniach (niewazne). co stanie sie z tymi obiektami typu Store/folder? tzn np:

public void run(){
  try{
//kod
 /* connect */
         store.connect((String) hm.get("host"), (String) hm.get("user"), (String) hm.get("password"));
//dalszy kod
//gdzies tam pozniej:
folder.open(Folder.READ_WRITE);
}catch(Exception e){ 
}finally({
store.close();
folder.close();
 try{
}catch(Exception e){}
}
}

i teraz tak - w przypadku jakiegos exception przejdzie mi do finally i zamknie store i folder. ale jesli ja chce ten watek ubic/zakonczyc np po 10h to czy przejdzie mi do finally? czy nim go ubije to powinnam wywolac metode do sprzatniecia, np cos w stylu:

   public void sweepAll(){
      try{
         folder.close(false);
         store.close();
      }catch(MessagingException mex){
        mex.printStackTrace();
      }
   }

chodzi mi o to, czy zniszczenie obiektu tego moje watku bedzie rownoznaczne z wywolaniem finally, a tym samym poprawnym zamknieciem folder i store?

pzdr,
misty

0

Watku sie nie niszczy, on sie po prostu konczy. Jesli skonczy sie normalnie (albo wyjatkiem albo nie) to finally sie wykona. Jesli bedzie jakis crash jvm to moze sie nie wykonac, ale to i tak juz po ptokach.
Przy czym Twoj watek wyglada na taki ktory wykonuje cos z tymi mailami tylko raz, nie brakuje tam petli?

0

nie no to tylko 3 linjki na krzyz bo chcialam pokazac o co mniej wiecej mi chodzi. spoko, ja mam to juz napisane zeby mi sie laczal co jakis czas i sprawdzal poczte. tylko wlasnie sie zastanawialam co bedzie ze store i folder jak on sie zniszczy. a wlasciwie -jak mnie dobrze poprawiles-skonczy sie. chcialam miec pewnosc ze dojdzie do finally.

dzieki,
pzdr

0

Jeszcze zalezy jak ta petla jest napisana - jam co iteracje otwierasz store i folder, a finally masz tylko raz po petli, to zamyka tylko te ostatnie.

0

mam o tak o:

public void run() {
 
      try {

         Session session = mailManager.getSession();
         // session.setDebug(true);
         store = session.getStore("imap");
         /* get email data */
         HashMap hm = getEmailData();
         /* connect */
         store.connect((String) hm.get("host"), (String) hm.get("user"), (String) hm.get("password"));
         /* open folder */
         folder = store.getFolder("Inbox");

         if (folder == null || !folder.exists()) {
            System.out.println("Invalid folder!");
         } else {
            folder.open(Folder.READ_WRITE);

            /* add listener to listen for new messages */
            folder.addMessageCountListener(new MessageCountAdapter() {

               public void messagesAdded(MessageCountEvent ev) {

                  Message[] msgs = ev.getMessages();
                  System.out.println("You have " + msgs.length + " new messages");

                  /* dump out new messages */
                  for (int i = 0; i < msgs.length; i++) {
                     try {

                        Message newMessage = msgs[i];
                        String mailSubject = newMessage.getSubject();
                        String mailContent = (String) newMessage.getContent();

                        System.out.println(mailSubject);
                        System.out.println(mailContent);

                     } catch (IOException ioex) {
                        ioex.printStackTrace();
                     } catch (MessagingException mex) {
                        mex.printStackTrace();
                     }
                  }
               }
            });

            for (;;) {
               Thread.sleep(frequency);
               folder.getMessageCount();
            }
         }

      } catch (Exception ex) {
         System.out.println("Cannot check email box ");
         ex.printStackTrace();

      } finally {
         try {
            folder.close(false);
            store.close();
         } catch (MessagingException mex) {
            mex.printStackTrace();
         }

      }
   }

1 użytkowników online, w tym zalogowanych: 0, gości: 1