线程(六)多线程间数据共享

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014252478/article/details/83538398

起多个线程时,分别执行不同的任务,如加减运行,一个线程负责增加increment, 一个线程用于减decrement:

1、例子:

public class MultiThreadShareData {

    public static void main(String[] args) {

        ShareData task = new ShareData(); //公共数据和任务放在task中

        for(int i = 0; i < 2; i ++) { //开启两个线程增加data

            new Thread(new Runnable() {

                @Override
                public void run() {
                    task.increment();
                }
            }).start();
        }

        for(int i = 0; i < 2; i ++) { //开启两个线程减少data

            new Thread(new Runnable() {

                @Override
                public void run() {
                    task.decrement();
                }
            }).start();
        }           
    }
}   


class ShareData /*implements Runnable*/ {

    private int data = 0;
    public synchronized void increment() { //增加data
        System.out.println(Thread.currentThread().getName() + ": before : " + data);
        data++;
        System.out.println(Thread.currentThread().getName() + ": after : " + data);
    }

    public synchronized void decrement() { //减少data
        System.out.println(Thread.currentThread().getName() + ": before : " + data);
        data--;
        System.out.println(Thread.currentThread().getName() + ": after : " + data);
    }
}

测试结果为:

Thread-0: before : 0 
Thread-0: after : 1 
Thread-1: before : 1 
Thread-1: after : 2 
Thread-2: before : 2 
Thread-2: after : 1 
Thread-3: before : 1 
Thread-3: after : 0

2、在实际项目中,同样采用的这种共享线程间数据和分类操作方式,但是需要注意的是,结束时需要将线程关闭:

public void pushOrderInfo(Map<Integer,Object> map, String message,ChargeOrderInfoReqVo chargeOrderInfoReqVo) {
        for (Map.Entry<Integer, Object> entry : map.entrySet()) {
            int nTimes = entry.getKey();
            ScheduledFuture<?> scheduledFuture = pool.scheduleWithFixedDelay(new Runnable() {
                @Override
                public void run() {
                    Map jsonMap = JacksonUtil.json2Bean(message, Map.class);
                    int ChargeLastTime = Integer.parseInt((String) jsonMap.get("EndTime")) - Integer.parseInt((String) jsonMap.get("StartTime")); //充电时长
                    chargeOrderInfoReqVo.setUserName((String) jsonMap.get("UserName"));
                    chargeOrderInfoReqVo.setStationID((String) jsonMap.get("StationID"));  //运营商自定义唯一编码?
                    chargeOrderInfoReqVo.setEquipmentID((String) jsonMap.get("EquipmentID")); //运营商设备唯一编码?
                    chargeOrderInfoReqVo.setConnectorPower(Float.parseFloat((String) jsonMap.get("ConnectorPower")) / 1000);
                    chargeOrderInfoReqVo.setChargeLast(ChargeLastTime);
                    chargeOrderInfoReqVo.setMeterValueStart(Float.parseFloat((String) jsonMap.get("MeterValueStart")) / 100);
                    chargeOrderInfoReqVo.setMeterValueEnd(Float.parseFloat((String) jsonMap.get("MeterValueEnd")) / 100);
                    System.out.println("------延时------");
                    LOG.info("------延时------");
                    try {
                        Thread.sleep(150000 * nTimes);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }, 10, 10, TimeUnit.SECONDS);


            pool.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    if (7 * 60 * 60 * 24 < nTimes * 150 && !Thread.currentThread().isInterrupted() ||
                            baseResponseVoData.getRet() == ConstantConfig.RET_SUCCESS) {
                        scheduledFuture.cancel(true);
                        //pool.shutdown();
                    }

                }
            }, 0, 10, TimeUnit.SECONDS);

        }
    }

这里,我使一个线程用于循环,用于数据变化,另一个线程用于检测,当超过使用条件时将另一个线程关闭。

总结:线程间数据共享,方便了使用,同时对于代码的清晰度更好。

猜你喜欢

转载自blog.csdn.net/u014252478/article/details/83538398