多執行緒處理任務

2021-09-02 20:58:30 字數 2676 閱讀 2973

業務需求是這樣:接受大量效能資料,要求多執行緒處理效能資料,且在任一時刻同種效能資料只能有一條在處理。

這裡有5個類:

processscheduler:入口,用於接受效能資料,並將每條效能資料加到佇列中處理

actionexecutor:執行緒池包裝類

actionqueue:任務佇列類,用於儲存同種效能任務,保證執行緒安全及,佇列中只有一條任務在乙個時刻 處理

processaction:任務類,每條效能任務包裝成乙個任務,且對資料處理的業務邏輯在此類中

actioncommand:command類,實現runnable介面,包裝任務類,用於執行緒池處理

以下**以最簡潔方式呈現

public final class actionqueue

public void addprocessaction(processaction action)

}// 若這時沒有這種任務在處理,則從actionqueue中獲得乙個可執行action,否則返回null

public processaction borrowonecanexecuteaction()

return null;}}

}

public final class processaction

public void execute()

}

public final class actioncommand implements runnable

public void run()

}

public final class processscheduler

private processscheduler()

public void process(listdatas)

}private void addaction(string location, processaction action)

if (!bstart)

//獲取該任務所屬佇列,將任務加入佇列,並處理佇列中一條任務

actionqueue queuefind = actionqueuemap.putifabsent(location,new actionqueue());

if(queuefind == null)

queuefind.addprocessaction(action);

processqueue(queuefind);

}// 從任務佇列倉庫中根據location獲取佇列,並嘗試處理佇列中一條可處理任務

public void exeactionbylocation(string location)

",location);

actionqueue queuefind = actionqueuemap.get(location);

if (queuefind == null)

processqueue(queuefind);

}// 嘗試從任務佇列queue取一條任務 並將其放入執行緒池處理

private void processqueue(actionqueue queue)

}//設定狀態bstart為true保證start方法只執行一次 呼叫actionexecutor的start方法

private synchronized void start()

bstart = true;

this.actionexecutor.start();

}}

public final class actionexecutor

//處理任務類,將其包裝為乙個command類,並放入執行緒池中

public void executeaction(processaction action, actionqueue queue)

}//例項化執行緒池物件

@suppresswarnings()

public void start()

blockingqueue blockingqueue = new linkedblockingqueue();

rejectedexecutionhandler handler = new threadpoolexecutor.discardpolicy()

", r);}};

this.executor = new threadpoolexecutor(corepoolsize, maxcurrentnum,

thread_keeplive_minute, timeunit.minutes,

blockingqueue, handler);

this.executor.setthreadfactory(new schedulerthreadfactory());

this.isstart = true;}}

// 靜態內部類用於包裝新建執行緒,主要功能是設定執行緒名稱、優先順序以及將新建執行緒設為非守護執行緒

static class schedulerthreadfactory implements threadfactory

@override

public thread newthread(runnable r)

return t;}}

}

這就是對這個業務需求的處理,我已經刪減過了

多執行緒處理任務

進行任務分解 long begin system.currenttimemillis list futurelist this.getsmoothdatafuture fundidlist,30 阻塞等待所有執行緒全部執行完畢 for futurefuture futurelist log.info...

多執行緒學習 任務,程序,執行緒

多個任務都在做,其實本質上我們的大腦在同一時間依舊只做了一件事情。程式是指令和資料的有序集合,其本身沒有任何執行的含義,是乙個靜態的概念。通常在乙個程序中可以包含若干個執行緒,當然乙個程序至少有乙個執行緒,不然沒有存在的意義。執行緒是cpu排程和執行的單位。執行緒就是獨立的執行路徑 在程式執行時,即...

多執行緒任務排程學習

昨天找到一套多執行緒任務排程的 相當的不錯,先把思路總結一下。首先需要有乙個任務管理器來管理所有的任務,任務管理器提供新增新任務的介面。然後需要有乙個執行緒池管理器管理所有的執行緒,執行緒分三種狀態 建立 執行 空閒三種狀態,執行緒可以執行任務task。主流程通過乙個taskmonitorthrea...