for (int i = 0; i < mailRecievers.length; i++) { if ( i % 3 == 1) { System.out.println("Sleeping 5 sec ..."); Thread.sleep(5000); } MailSender ms = new MailSender(mailReceivers[i]); ms.start(); }
class MailSender extends Thread { private String receiver; public MailSender(String receiver){ this.receiver = receiver; } public void run( ) { try { FileOutputStream mailMessage.setRecipient(Message.RecipientType.TO, receiver); mailTrans.send(mailMessage); } catch (Exception e) { System.out.println("Error while sending, " + e.getMessage()); } }
Prøv eventuelt at vende din for løkke, således at den tæller ned i stedet for, brug derefter setPriority(i) på tråden, så vil en ny tråd ikke overtage får tråden "i" er død.
Husker du at lave din kode trådsikker? Det er et komplekst emne i teorien, men lav klassen syncronized så har du ikke problemer med din kritiske sektion (dvs. variablerne i klassen).
Jeg har en masse System.out.println og de viser såmænd det jeg forventer.
Som koden ser ud nu, har jeg oprettet en klasse hvori der kun findes en funktion, der i en tråd sender en mail ud. Funktionen modtager en Mimemessage og en adresse.
Denne funktion kaldes i en for løkke, problemerne lige nu er, 1) at den ikke sender det forventede antal mails. 2) indholdet af mailen, (som pt. er counteren fra for løkken) ... virker lidt tilfældig.
Det ser jo ud som om jeg giver tråden et nyt kald førend den har behandlet det første kald.
Klassen : ****************************** class MailSender {
public void send( String adr, MimeMessage message ) { final String thisAdr = adr; final MimeMessage myMessage = message; new Thread( ) { public void run( ) { try { myMessage.addRecipient(javax.mail.internet.MimeMessage.RecipientType.TO, new InternetAddress(thisAdr)); Properties props = new Properties(); props.put("mail.smtp.host", "localhost"); Session sendMailSession; sendMailSession = Session.getInstance(props, null); Transport transport; transport = sendMailSession.getTransport("smtp"); transport.send(myMessage); } catch (Exception e) { System.out.println("Udsending fejlede " + e.getMessage()); } } }.start(); } }
Koden som kalder klassen ******************************************* Vector myMails = new Vector(); Vector myInts = new Vector();
for (int i = 0; i < mailRecievers.length; i++) { if ( i % 3 == 1) { System.out.println("Sleeping 5 sec ..."); Thread.sleep(5000); } String tmpStr = "Du er " + i; message.setText(tmpStr); MailSender ms = new MailSender(); myMails.add(ms); Integer myInt = new Integer(i); myInts.add(myInt); System.out.println(myInt); ms.send(mailRecievers[myInt.intValue()].getAddress(), message); }
Hvorfor er det at du ikke bare sikrer din kode, så den er reentrant? Så slipper du for at tænke så meget :-)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.