日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

串行任务如何提高效率Java_具有相同属性任务串行有序执行的线程池设计

發(fā)布時間:2025/3/12 java 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 串行任务如何提高效率Java_具有相同属性任务串行有序执行的线程池设计 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我有一個這樣的線程池的場景,相信很多人都遇到過:

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。