版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}
}
这里,我使一个线程用于循环,用于数据变化,另一个线程用于检测,当超过使用条件时将另一个线程关闭。
总结:线程间数据共享,方便了使用,同时对于代码的清晰度更好。