上述代码如何使用对象池进行优化,请给出优化代码
时间: 2023-08-11 17:32:18 浏览: 47
可以使用对象池对代码进行优化,避免频繁地创建和销毁对象,提高程序的性能。下面是优化后的代码:
```
@Data
public class PropertiesMessage implements Serializable {
private Map<String, DeviceProperties> propertiesMap;
}
@Data
public class DeviceProperties implements Serializable {
private String value;
}
@AllArgsConstructor
public class StorageConfig {
private String value;
}
@AllArgsConstructor(onConstructor = @__({@Autowired}))
public class StorageListen {
private static final int POOL_SIZE = 10;
private static final ObjectPool<PropertiesMessage> propertiesMessagePool = new GenericObjectPool<>(new PropertiesMessageFactory());
private static final ObjectPool<DeviceProperties> devicePropertiesPool = new GenericObjectPool<>(new DevicePropertiesFactory());
private PeriodStorage periodStorage;
@Scheduled(cron="*/1 * * * * ?")
@Async("PeriodStorage")
public void periodStorage() throws Exception {
PropertiesMessage propertiesMessage = propertiesMessagePool.borrowObject();
Map<String, List<StorageConfig>> map = new HashMap<>();
List<StorageConfig> list = new ArrayList<>();
StorageConfig s1 = new StorageConfig();
s1.setValue("1");
StorageConfig s2 = new StorageConfig();
s2.setValue("1");
list.add(s1);
list.add(s2);
map.put("1", list);
periodStorage.storageData(propertiesMessage, map);
propertiesMessagePool.returnObject(propertiesMessage);
}
private static class PropertiesMessageFactory extends BasePooledObjectFactory<PropertiesMessage> {
@Override
public PropertiesMessage create() {
return new PropertiesMessage();
}
@Override
public PooledObject<PropertiesMessage> wrap(PropertiesMessage propertiesMessage) {
return new DefaultPooledObject<>(propertiesMessage);
}
}
@AllArgsConstructor
private static class DevicePropertiesFactory extends BasePooledObjectFactory<DeviceProperties> {
@Override
public DeviceProperties create() {
return new DeviceProperties();
}
@Override
public PooledObject<DeviceProperties> wrap(DeviceProperties deviceProperties) {
return new DefaultPooledObject<>(deviceProperties);
}
}
}
@AllArgsConstructor(onConstructor = @__({@Autowired}))
public class PeriodStorage {
private static final ObjectPool<DeviceProperties> devicePropertiesPool = new GenericObjectPool<>(new DevicePropertiesFactory());
public void storageData(PropertiesMessage message, Map<String, List<StorageConfig>> map) throws Exception {
map.entrySet().stream().forEach(k -> {
k.getValue().parallelStream().forEach(y -> {
DeviceProperties deviceProperties = null;
try {
deviceProperties = devicePropertiesPool.borrowObject();
System.out.println(y.toString());
System.out.println(deviceProperties.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (deviceProperties != null) {
devicePropertiesPool.returnObject(deviceProperties);
}
}
});
});
}
private static class DevicePropertiesFactory extends BasePooledObjectFactory<DeviceProperties> {
@Override
public DeviceProperties create() {
return new DeviceProperties();
}
@Override
public PooledObject<DeviceProperties> wrap(DeviceProperties deviceProperties) {
return new DefaultPooledObject<>(deviceProperties);
}
}
}
```
优化后的代码使用了Apache Common Pool2提供的对象池来管理PropertiesMessage和DeviceProperties对象。在StorageListen类中,定义了一个大小为10的PropertiesMessage对象池和一个大小为10的DeviceProperties对象池。在periodStorage方法中,从PropertiesMessage对象池中借用一个对象,然后调用periodStorage对象的storageData方法,并在方法执行完成后将对象还回对象池。在PeriodStorage类中,定义了一个大小为10的DeviceProperties对象池,每次需要使用DeviceProperties对象时从对象池中借用一个对象,使用完成后将对象还回对象池。这样就避免了频繁地创建和销毁对象,提高了程序的性能。