У меня есть реализация Producer / Consumer, использующая блокировку, я запускаю их вот так
BlockingQueue<Object> myQueue1 = new LinkedBlockingQueue<Object>();
new Thread(new SmsInProducer(myQueue1, 100)).start();
for (int i = 0; i < 100; i++ ) {
new Thread(new SmsInConsumer(myQueue1)).start();
}
Внутри продюсер выглядит так
public class SmsInProducer implements Runnable {
protected BlockingQueue queue;
protected int MAX_RECORDS = 5000;
@SuppressWarnings("rawtypes")
public SmsInProducer(BlockingQueue theQueue, int maxRecord) {
this.queue = theQueue;
this.MAX_RECORDS = maxRecord;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
int totalRecords = MAX_RECORDS - queue.size();
if (totalRecords > 0) {
List<Map> tList = Sql.updateTRECEIVE();
if (tList != null && !tList.isEmpty()) {
queue.addAll(tList);
}
}
// wait for 1 second
try { Thread.sleep(Parameter.replyWaitTime * 1000); } catch(Exception e) {}
}
}
и потребитель выглядит так
public class SmsInConsumer implements Runnable {
@SuppressWarnings("rawtypes")
protected BlockingQueue queue;
@SuppressWarnings("rawtypes")
public SmsInConsumer(BlockingQueue theQueue) {
this.queue = theQueue;
}
@SuppressWarnings("rawtypes")
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Object obj = queue.take();
Map map = (Map) obj;
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
} catch (Exception e) {
e.printStackTrace();
} finally {
try { Thread.sleep(Parameter.replyWaitTime * 1000); } catch(Exception e){}
}
}
}
Но через какое-то время это становится очень медленным, могу ли я в любом случае поддерживать его очень быстрым?