Java 这是fork-in-join的正确代码吗?

Java 这是fork-in-join的正确代码吗?,java,parallel-processing,fork-join,Java,Parallel Processing,Fork Join,我开始在Java中阅读for in-join,所以我的目标是验证JavaMail中具有附件的消息 我怀疑这是否正确。因为我看到一些教程将数组拆分为两部分,每个lopp。我把我所有的类代码放在下面来演示我做了什么 package service.forkinjoin; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import ja

我开始在
Java
中阅读
for in-join
,所以我的目标是验证
JavaMail
中具有附件的消息

我怀疑这是否正确。因为我看到一些教程
将数组拆分为两部分,每个
lopp
。我把我所有的类代码放在下面来演示我做了什么

package service.forkinjoin;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.RecursiveTask;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.MimeBodyPart;

import service.FileUtil;

public class SepareteMessagesProcess extends RecursiveTask<List<Message>> {

    private static final long serialVersionUID = 7126215365819834781L;
    private List<Message> listMessages;
    private static List<Message> listMessagesToDelete = new ArrayList<>();
    private final int threadCount = Runtime.getRuntime().availableProcessors();

    public SepareteMessagesProcess(List<Message> listMessages) {
        this.listMessages = listMessages;
    }

    @Override
    protected List<Message> compute() {

        if (this.listMessages.size() <= threadCount) {
            try {
                this.separateMessages(this.listMessages);
            } catch (MessagingException | IOException e) {
                e.printStackTrace();
            }
        } else {
            int[] arrayMaxIndex = this.generateIndexs(this.listMessages);
            List<SepareteMessagesProcess> list = this.splitList(this.listMessages, arrayMaxIndex);
            invokeAll(list);
        }

        return listMessagesToDelete;
    }

    private void separateMessages(List<Message> listMessages) throws MessagingException, IOException {

        for (Iterator<Message> iterator = listMessages.iterator(); iterator.hasNext();) {

            Message message = (Message) iterator.next();

            if ((this.hasNoAttachment(message.getContentType()) || (this.hasNoXmlAttachment(message)))) {
                listMessagesToDelete.add(message);
            } 
        }
    }

    private List<SepareteMessagesProcess> splitList(List<Message> listMessages, int[] arrayMaxIndex) {

        List<SepareteMessagesProcess> list = new ArrayList<>(this.threadCount);
        int end = 0;
        int start = 0;

        for (int i = 0; i < this.threadCount; i++) {
            end += (arrayMaxIndex[i]);
            list.add(new SepareteMessagesProcess(listMessages.subList(start, end)));
            start += arrayMaxIndex[i];
        }

        return list;
    }

    private int[] generateIndexs(List<Message> listMessages) {

        int value = listMessages.size() / this.threadCount;
        int[] arrayMaxIndex = new int[this.threadCount];

        for (int i = 0; i < this.threadCount; i++) {
            arrayMaxIndex[i] = value;
        }
        arrayMaxIndex[this.threadCount - 1] += listMessages.size() % threadCount;

        return arrayMaxIndex;
    }

    private boolean hasNoAttachment(String content) {
        return !content.contains("multipart/MIXED");
    }

    private boolean hasNoXmlAttachment(Message message) throws IOException, MessagingException {

        Multipart multipart = (Multipart) message.getContent();         

        for (int i = 0; i < multipart.getCount(); i++) {

            MimeBodyPart mimeBodyPart = (MimeBodyPart) multipart.getBodyPart(i);

            if (Part.ATTACHMENT.equalsIgnoreCase(mimeBodyPart.getDisposition())) {

                if  (FileUtil.isXmlFile(mimeBodyPart.getFileName())) {
                    return false;
                }
            }
        }

        return true;
    }
}
package service.forkinjoin;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入java.util.concurrent.RecursiveTask;
导入javax.mail.Message;
导入javax.mail.MessaginException;
导入javax.mail.Multipart;
导入javax.mail.Part;
导入javax.mail.internet.MimeBodyPart;
导入服务.FileUtil;
公共类SeparateMessageProcess扩展了RecursiveTask{
私有静态最终长serialVersionUID=7126215365819834781L;
私人列表信息;
private static List listMessagesToDelete=new ArrayList();
private final int threadCount=Runtime.getRuntime().availableProcessors();
公共分离消息流程(列表消息){
this.listMessages=listMessages;
}
@凌驾
受保护列表计算(){

如果(this.listMessages.size()No.)不需要在此处重写教程,只需按照它给出的示例进行操作,例如:

 if (problem is small)
     directly solve problem
   else {
    split problem into independent parts
    fork new subtasks to solve each part
    join all subtasks
    compose result from subresults
}

我有一个疑问,如果我有一个包含电子邮件的列表,那么我想按每个发件人来分隔in文件夹,是否可以使用fork-in-join?使用hashmap来分隔?