串行任务如何提高效率Java_具有相同属性任务串行有序执行的线程池设计
我有一個這樣的線程池的場景,相信很多人都遇到過:
1,每個用戶都可以添加多個任務;
2,有很多的用戶和很多的任務;
3,每個用戶添加的任務必須有序串行執行,即在同一時刻不能有同時執行一個用戶的兩個任務;
4,實時性:只要線程池線程有空閑的,那么用戶提交任務后必須立即執行;盡可能提高線程的利用率。
代碼比較簡潔,基本滿足上述要求:
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);
}
}
}
}
}
這個實現有幾個缺陷:
1,每次添加一個任務都要進入一次鎖,有一點小小開銷;
2,serialJobs會一直在內存中,當某個key的任務很久沒有添加了,對應的SequentialJob對象一直存在,雖然不占用很多內存,但對于有潔癖的人來說或,還是不爽。
拋磚引玉,看看廣大網友是否可以優化。
(異常處理等細節大家就不要理會了)
總結
以上是生活随笔為你收集整理的串行任务如何提高效率Java_具有相同属性任务串行有序执行的线程池设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用计算机弹奏曲子童年,5.这首曲子使我想
- 下一篇: java map 多种类型吗_是多种类型