gpt4 book ai didi

Java多线程应用程序不运行方法

转载 作者:行者123 更新时间:2023-12-02 10:57:58 25 4
gpt4 key购买 nike

我正在使用 Java 开发一个电子邮件应用程序,并且正在尝试实现一个 Java 线程池以将进程分解为多个线程。

我有 10 个线程尝试向多个收件人发送电子邮件,现在的问题是,当我运行代码时,它显示池中的线程数,并忽略执行类中的方法。

这是我的代码:

package system.soft.processor;

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import system.source.DjadeUtil;

public class MailTransporter {
// HERE WE SET PUBLIC VARIABLES
private SetBase Setting;
private String[] Mails;
private String Messaging;
private String Title;
private static final String TEMPLATESOURCE="data/templates/vs1/newslatter.php";

// LETS CONSTRUCT MAIN CLASS
public MailTransporter(String[] mails, SetBase setting){
Setting=setting;
Mails=mails;
};


/********************** SETTING THE GETTERS METHODS ************************/
public void subject(String subject){
Title=subject;
}


public void message(String message){
Messaging=message;
}

/********************** CONSTRUCTING THE SEND METHOD ***********************/
public static void main(String[] args){
// HERE WE CONSTRUCT THE SEND
SetBase setting=new SetBase();
String[] mails={"gettrafficworld@yahoo.com", "chineduweb@gmail.com"};
String title="Testing Dynamic Message";
String message="This is the body of the message";
int NUM_THREADS=Integer.parseInt(setting.get("maxThread"));
MailTransporter transport=new MailTransporter(mails, setting);
transport.subject(title);
transport.message(message);
// Create a thread pool
ExecutorService es = Executors.newFixedThreadPool(NUM_THREADS);
List<Future<Integer>> futures = new ArrayList<>(NUM_THREADS);

// Submit task to every thread:
for (int i = 0; i < NUM_THREADS; i++) {
futures.add(i, es.submit((Callable<Integer>) new Transporter(transport)));
}

// Shutdown thread pool
es.shutdown();

System.out.println(futures.size());


}


/********************** CONSTRUCTING THE TRANSPORT METHOD ***********************/
private Integer transport(String[] mails, String title, String messaging){
// HERE WE START PROCESSING THE TRANSPORT
Integer sent=0;
// HERE WE START PROCESSING
// Sender's email ID needs to be mentioned
String from = Setting.get("from");

// Get system properties
Properties properties = props();
System.out.println(properties);
// Get the default Session object.
Session session = session(properties);

try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);

// Set From: header field of the header.
message.setFrom(new InternetAddress(from));

// Set To: header field of the header.
message.addRecipients(Message.RecipientType.TO, mailAddress(mails));


// Set Subject: header field
message.setSubject(Title);

// Send the actual HTML message, as big as you like
message.setContent(msgTranslate(Title, Messaging), "text/html");
// Send message
Transport.send(message);
// Setting the message return
sent=mails.length;
} catch (MessagingException mex) {
mex.printStackTrace();
}

// Here we return int
return sent;
}



/******************* CONSTRUCTING THE MESSAGE TRANSLATOR ********************/
private String msgTranslate(String subject, String messaging){
// HERE WE START CONSTRUCTING THE MESSAGE TRANSLATE
String data="";
DjadeUtil util=new DjadeUtil();
// NOW LETS START PROCESSING
if(messaging!=null && subject!=null){
// Now lets read
try {
data=util.readByScanner(TEMPLATESOURCE);
// Now lets check
if(data.length()>0){
data.replaceAll("%title%", subject);
data.replaceAll("%message%", messaging);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Here we return string
return data;
}


/******************* CONSTRUCTING RECEPIENT PARSER METHOD *******************/
private InternetAddress[] mailAddress(String[] mails){
// HERE WE START PROCESSING THE MAIL ADDRESSES
InternetAddress[] address={};
// NOW LETS START

if(mails!=null){
if(mails.length>0){
address=new InternetAddress [mails.length];
for(int i=0; i<mails.length; i++){
try {
address[i]=new InternetAddress(mails[i]);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

// Here we return address
return address;
}


/********************** CONSTRUCTING THE PROPERTY METHOD ********************/
private Properties props(){
// HERE WE START SETTING MESSAGE PROPERTIES
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties properties = System.getProperties();
String host = "localhost";
// HERE WE START SETTING
// Setup mail server
properties.setProperty("mail.smtp.host", host);
properties.setProperty("mail.smtp.host", Setting.get("host"));
properties.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
// properties.put("mail.smtp.ssl.trust", "*");
properties.setProperty("mail.smtp.socketFactory.fallback", "false");
properties.put("mail.smtp.socketFactory.port", Setting.get("port"));
properties.setProperty("mail.smtp.port", Setting.get("port"));
properties.setProperty("mail.smtp.socketFactory.port", Setting.get("port"));
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.debug", "true");
properties.put("mail.store.protocol", Setting.get("sp"));
properties.put("mail.transport.protocol", Setting.get("tp"));

// Here we return property
return properties;
}


/********************** CONSTRUCTING THE SESSION METHOD ***********************/
private Session session(Properties props){
// HERE WE START SETTING THE SESSION
// Get the default Session object.
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(Setting.get("username"), Setting.get("password"));
}
});

// Here we return session
return session;
}


/******************** HERE WE CONSTRUCT TRANSPORT CLASS ***********************/
public static final class Transporter implements Callable<Integer>{
// HERE WE CONSTRUCT CLASS
private String Message;
private String Title;
private String[] Mails;
MailTransporter Transport;

public Transporter(MailTransporter transport){
Mails=transport.Mails;
Title=transport.Title;
Message=transport.Messaging;
Transport=transport;
}

/*********** HERE WE CALL THE CALLABLE ***********/
@Override
public Integer call() throws Exception {
return Transport.transport(Mails, Title, Message);
}

// END OF INNER CLASS
}

// END OF OUTER CLASS
}

我无法弄清楚我的代码出了什么问题。我似乎无法得到我想要的输出。该代码没有发送我的邮件,当我尝试将其组合在一起时,它仍然无法工作。

最佳答案

我建议捕获任何异常或错误,否则它将默默地存储在您要丢弃的 submit 返回的 Future 中。

    @Override
public Integer call() throws Exception {
try {
return Transport.transport(Mails, Title, Message);
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException(t);
}
}

如果没有这个,您的任务将因异常或错误而默默地终止,而您将不知道为什么

关于Java多线程应用程序不运行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51571816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com