我什么时候应该在下面的代码中使用同步块

时间:2019-05-12 21:46:54

标签: java multithreading review

在联系人列表中,每个联系人都有一定数量的策略。如果策略超过50,那么我需要使用新线程来分配给另一个联系人,我所做的是创建一个内部类存储数组对象,该对象扩展了线程类,并编写了一种将策略分配给另一个联系人的方法,但是在发送之前新线程的策略列表我正在数组中提取策略并将其发送。

我要实现的是,当用户分配的策略大于50时,他应该能够浏览其他页面来执行其他任务。我的问题是

以这种方式实现多线程是否正确,因为当用户再次从同一联系人分配时,它将获取较少的策略,从而对另一个线程执行相同的工作? 2.如果他尝试同时创建更多线程,最后我该如何改进?

我所做的是创建一个内部类,该类存储扩展了线程类的数组对象,并编写了一种将策略分配给另一个联系人的方法,但是在将策略列表发送到新线程之前,我正在数组中获取策略并发送

 //getting policies from database

    List < Map < String, String >> policies = new ArrayList < > (); try { //getting list of policies

    policies = JsonStrToMap(GetContactPoliciesClient.getContactPolicies(custNum, fromContactSeq)); policiesCount = policies.size();

    //policies greater than 50 assigning new thread

    if (!policies.isEmpty() && policiesCount >= 50) { 
new assignPoliciesNewThread(policies, nameWithSeq).start();

    //inner class for new thread 
    class assignPoliciesNewThread extends Thread {
        private final List < Map < String, String >> policies;
        private final String toSequence;

        public assignPoliciesNewThread(List < Map < String, String >> policies, String toSequence) {
            this.policies = policies;
            this.toSequence = toSequence;
        }

        public void run() {
            Policy policy = new Policy();
            try {
                for (Map pol: policies) {
                    HashMap < String, Object > map = new HashMap < > ();
                    policy.setLevel1Org(100);
                    policy.setOutsideProd_contactSeq(toSequence);
                    policy.setCustNum(pol.get(APIGEE_MODIFY_POLICY_APPLICATION_CUSTNUM).toString());
                    policy.setPolicyNum(pol.get(APIGEE_MODIFY_POLICY_APPLICATION_POLICYNUM).toString());
                    policy.setPolicySeq(Integer.valueOf(pol.get(APIGEE_MODIFY_POLICY_APPLICATION_POLICYSEQ).toString()));
                    map.put("policy", policy);
                    try {
                        policy = (Policy) ApigeeCommonClientUtility.callApigee(map, "modifypolicy", HashMap.class, Policy.class);
                    } catch (Exception e) {
                        logger.error(e.toString());
                    }
                }
            } catch (Exception e) {
                logger.error(e.toString());
            }
        }
    }

0 个答案:

没有答案