Threadpoolexecutor - 使用作业列表提交作业?

下面的代码是一个Customer和jobManager。客户有姓名、地址和帐户余额。工作是从一个客户到另一个客户的资金转移。这是一个 Threadpoolexecutor 培训计划。以下版本有效,我一一提交作业。


客户.java


public class customer {


    private String name;

    private String adress;

    private Double accountBalance;


    public customer(String name, String adress, Double accountBalance)

    {

        this.name = name;

        this.adress = adress;

        this.accountBalance = accountBalance;

    }


    public String getName() { return name; }


    public String getAdress()

    {

        return adress;

    }


    public Double getAccountBalance(){return accountBalance;}


    public void setAccountBalance(double accountBalance){this.accountBalance=accountBalance;}


    @Override

    public String toString(){


        return "[" + name+"; " +adress+"; "+accountBalance+"]";

    }

}

客户组织者.java


import java.util.ArrayList;

import java.util.List;


public class customerOrganizer {


    private static final customerOrganizer myJobOrganizer = new customerOrganizer();


    public static customerOrganizer getJobOrganizer(){

        return myJobOrganizer;

    }


    private List<customer> customerList = new ArrayList<customer>();


    public void add_customer(customer kunde)

    {

        this.customerList.add(kunde);

    }


    public Iterable<customer> all_customers()

    {

        return this.customerList;

    }


    public static customerOrganizer getInstance()

    {

        return myJobOrganizer;

    }


}

作业.java


public class job implements Runnable {

    private customer kunde1;

    private customer kunde2;

    private Double transfer;


    public job(customer kunde1, customer kunde2, Double transfer) {

        this.kunde1 = kunde1;

        this.kunde2 = kunde2;

        this.transfer = transfer;

    }


    @Override

    public String toString(){


        return "[" + kunde1+"; " +kunde2+"; "+transfer+"]";

    }


狐的传说
浏览 137回答 2
2回答

呼唤远方

ExecutorService处理如何在工人之间分配任务。你所要做的就是一个一个地传递作业。for (job jobObj : myJobOrganizer.all_jobs())&nbsp;&nbsp; &nbsp; executor.submit(jobObj);请注意,sumbitreturn aFuture<?>用于跟踪您的任务是否已完成,或者是否出错(还有任务结果,但 runnable 没有结果)。如果您关心这些东西,您可能希望将它们收集在某种容器中,例如List.如果您将 更改job为Callable<Void>,则提交会容易得多。Callable是 Runnable 的某种扩展,允许任务在完成时产生结果。由于您的传输没有结果,因此将其java.lang.Void用作泛型参数的填充类型就可以了。现在,只要做executor.invokeAll(myJobOrganizer.all_jobs())就足够了。这将节省一些上下文切换,加快速度。(实际上很重要,因为你的任务都很小)顺便说一句,您应该知道并发访问需要适当的同步,而您没有。如果不同的工作涉及同一个帐户,您的帐户最终可能会处于错误状态。我们也通常用大驼峰命名类,用小驼峰命名方法名。

红颜莎娜

Stream如果你不想使用循环,你可以使用它来做到这一点。如果您使用的是大于或等于 8 的 Java 版本,这里是一个示例&nbsp; &nbsp; myJobList&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .forEach(e -> executor.execute(() -> {&nbsp; &nbsp; &nbsp; &nbsp; //submit the jobs&nbsp; &nbsp; }));或者&nbsp; &nbsp; myJobOrganizer.all_jobs()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .forEach(e -> executor.submit(e));executor.invokeAll(myJobList)如果您真的不想要循环,您可以使用提交您的列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java