为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

狐的传说 2021-12-10 15:33:33
下面的代码是一个Customer和jobManager。客户有姓名、地址和帐户余额。工作是从一个客户到另一个客户的资金转移。这是一个 Threadpoolexecutor 培训计划。以下版本有效,我一一提交作业。客户.javapublic 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+"]";    }}客户组织者.javaimport 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;    }}作业.javapublic 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+"]";    }
查看完整描述

2 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

ExecutorService处理如何在工人之间分配任务。你所要做的就是一个一个地传递作业。


for (job jobObj : myJobOrganizer.all_jobs()) 

    executor.submit(jobObj);

请注意,sumbitreturn aFuture<?>用于跟踪您的任务是否已完成,或者是否出错(还有任务结果,但 runnable 没有结果)。如果您关心这些东西,您可能希望将它们收集在某种容器中,例如List.


如果您将 更改job为Callable<Void>,则提交会容易得多。Callable是 Runnable 的某种扩展,允许任务在完成时产生结果。由于您的传输没有结果,因此将其java.lang.Void用作泛型参数的填充类型就可以了。


现在,只要做executor.invokeAll(myJobOrganizer.all_jobs())就足够了。这将节省一些上下文切换,加快速度。(实际上很重要,因为你的任务都很小)


顺便说一句,您应该知道并发访问需要适当的同步,而您没有。如果不同的工作涉及同一个帐户,您的帐户最终可能会处于错误状态。我们也通常用大驼峰命名类,用小驼峰命名方法名。


查看完整回答
反对 回复 2021-12-10
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

Stream如果你不想使用循环,你可以使用它来做到这一点。如果您使用的是大于或等于 8 的 Java 版本,这里是一个示例


    myJobList

            .stream()

            .forEach(e -> executor.execute(() -> {

        //submit the jobs

    }));

或者


    myJobOrganizer.all_jobs()

            .stream()

            .forEach(e -> executor.submit(e));

executor.invokeAll(myJobList)如果您真的不想要循环,您可以使用提交您的列表。


查看完整回答
反对 回复 2021-12-10
  • 2 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号