串行任务如何提高效率Java_具有相同属性任务串行有序执行的线程池设计
我有一個這樣的線程池的場景,相信很多人都遇到過:
1,每個用戶都可以添加多個任務(wù);
2,有很多的用戶和很多的任務(wù);
3,每個用戶添加的任務(wù)必須有序串行執(zhí)行,即在同一時刻不能有同時執(zhí)行一個用戶的兩個任務(wù);
4,實(shí)時性:只要線程池線程有空閑的,那么用戶提交任務(wù)后必須立即執(zhí)行;盡可能提高線程的利用率。
代碼比較簡潔,基本滿足上述要求:
public class SerialThreadExecutor {
private Executor executor;
private ConcurrentMap serialJobs = new ConcurrentHashMap();
public SerialThreadExecutor(Executor executor) {
super();
this.executor = executor;
}
public void executeSerially(Object key, Runnable r) {
SequentialJob job = serialJobs.get(key);
if (job == null) {
job = new SequentialJob(key);
SequentialJob oldJob = serialJobs.put(key, job);
if (oldJob != null) {
job = oldJob;
}
}
job.addJob(r);
}
private class SequentialJob implements Runnable {
private BlockingQueue jobs = new LinkedBlockingQueue();
private Object key;
private AtomicBoolean running = new AtomicBoolean(false);
public SequentialJob(Object key) {
this.key = key;
}
public void run() {
Runnable r = null;
while (true) {
try {
r = jobs.poll(50, TimeUnit.MILLISECONDS);
if (r != null) {
r.run();
} else {
synchronized (this) {
if (jobs.isEmpty()
&& running.compareAndSet(true, false)) {
return;
} else {
continue;
}
}
}
} catch (InterruptedException e) {
// TODO
e.printStackTrace();
}
}
}
public void addJob(Runnable r) {
synchronized (this) {
jobs.add(r);
if (running.compareAndSet(false, true)) {
executor.execute(this);
}
}
}
}
}
這個實(shí)現(xiàn)有幾個缺陷:
1,每次添加一個任務(wù)都要進(jìn)入一次鎖,有一點(diǎn)小小開銷;
2,serialJobs會一直在內(nèi)存中,當(dāng)某個key的任務(wù)很久沒有添加了,對應(yīng)的SequentialJob對象一直存在,雖然不占用很多內(nèi)存,但對于有潔癖的人來說或,還是不爽。
拋磚引玉,看看廣大網(wǎng)友是否可以優(yōu)化。
(異常處理等細(xì)節(jié)大家就不要理會了)
總結(jié)
以上是生活随笔為你收集整理的串行任务如何提高效率Java_具有相同属性任务串行有序执行的线程池设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用计算机弹奏曲子童年,5.这首曲子使我想
- 下一篇: java map 多种类型吗_是多种类型