其他地方有多线程调用putBeat方法,当list里面有8000条数据的时候就做一次批处理,现在想如果5秒内没有数据进来,则不满8000条也做同样的批处理操作, 这个时间改怎么加呢
public class T { private int batchSize = 8000;
private Object object;
private ArrayList<String> list = new ArrayList<String>();
public void putBeat(String rtua, String heartBeatTime) {
synchronized (object) {
if (list.size()>batchSize) {
//存满batchSize后做批处理
}
list.add(rtua+heartBeatTime);
/**
* 如果5秒内没有数据进来,则也做批处理
*/
}// end
}
}
如果是这样,可以在程序外边写个小程序,算时间用的,可以int n,每过一秒自动+1,然后在程序public void putBeat(String rtua, String heartBeatTime)里面判断是否n==5,等于5了就操作
顶!
不太清楚你的业务,简单做一个例子吧,跟上面说的是一个意思. 这里直接把Timer写成了T的一个属性了,根据业务,这个Timer应该是系统唯一的(单例的),你再根据业务调整吧, 不知道是不是你想要的功能. 这里是BlockedTimer的说明:class T { private int batchSize = 8000;
private static int maxIdle=5000;
private Object object;
private List<String> list = new ArrayList<String>();
// 定时器
private BlockedTimer timer=new BlockedTimer(maxIdle){
public void onTimer() {
doBatch(); // 批处理
}
};
public T(){
timer.start();
}
public void putBeat(String rtua, String heartBeatTime) {
synchronized (object) {
if (list.size()>batchSize) {
doBatch(); // 批处理
}
list.add(rtua+heartBeatTime);
/**
* 如果5秒内没有数据进来,则也做批处理
*/
}// end
}
public void doBatch() {
timer.reset(); // 重新计时
synchronized (object){
//存满batchSize后做批处理
}
}
}
private Object object;
private ArrayList<String> list = new ArrayList<String>();
long lastTime = System.currentTimeMillis();
public void putBeat(String rtua, String heartBeatTime) {
synchronized (object) {
if (list.size()>batchSize) {
//存满batchSize后做批处理
}
list.add(rtua+heartBeatTime);
lastTime = System.currentTimeMillis();
/**
* 如果5秒内没有数据进来,则也做批处理
*/
}// end
}
public boolean disTime(){
long delta = System.currentTimeMillis() - lastTime;
return Math.abs(delta) >= 5*1000 && heartBeatArray.getSize()>0;
}
public void add(){
HeartBeatArray batchSaveArray = heartBeatArray;
if (batchSaveArray != null)
addBatchSaveArray(batchSaveArray);
}}启动线程的时候调用T() public void T(){
try {
Thread.sleep(10*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
add();
T();
}
public void add() {
// TODO Auto-generated method stub
System.out.println("add:"+System.currentTimeMillis());
if(batchSaver.disTime()){
batchSaver.add();
}
}
class T { private int batchSize = 8000;
private Object object;
private ArrayList<String> list = new ArrayList<String>();
private boolean bBatch;
T()
{
startTimer();
}
public void putBeat(String rtua, String heartBeatTime) {
synchronized (object) {
if (list.size()>batchSize) {
batch();
}
list.add(rtua+heartBeatTime);
bBatch = false;
}
}
private void batch()
{
}
public void startTimer()
{
TimerTask task = new TimerTask()
{
public void run()
{
if(bBatch)
{
batch();
}
else
{
bBatch = true;
}
}
};
new Timer().scheduleAtFixedRate(task, 0,5000);
}
}
放在putBeat方法里面好一点。