我正在嘗試為我們的 Java 應用程式創建 10 個執行緒并讓它們始終保持活動狀態。這 10 個執行緒應該一直處于活動狀態并運行我分配給它們的任務。我嘗試分配給它們的任務是檔案下載、報告下載和 PDF 下載。
我試圖通過讓他們一直睡覺并在為他們分配新任務時打斷他們來讓他們活著。但是,這些檔案生成基于我們系統中的不同引數,因此我無法在 InterruptedException 例外捕獲塊中定義我的檔案生成邏輯。我很好奇是否有辦法中斷執行緒并在不擴展執行緒或實作可運行介面的類中為它們分配不同的任務(函式)?
我創建了 10 個一直休眠的執行緒,并將它們添加到公共靜態陣列串列中。
for (int i = 0; i < NUM_THREADS_DOWNLOAD; i ) {
Thread tempT = new Thread() {
public void run(){
Thread.currentThread().setName(BriString.value(WebServer.getThreadIndex()));
while (true) {
try {
sleep(300);
} catch (InterruptedException e) {
//DYNAMIC LOGIC OF FILE/REPORT/PDF GENERATION
}
}
}
};
tempT.start();
DOWNLOAD_THREAD_POOL.add(tempT);
}
下面是我試圖訪問活著的執行緒并想在那里添加邏輯的代碼。
for (int i = 0; i < WebServer.DOWNLOAD_THREAD_POOL.size(); i ) {
Thread tempT = WebServer.DOWNLOAD_THREAD_POOL.get(i);
String currentName = tempT.getName().replaceAll("\\D ","");
if (tempT.isAlive()) {
tempT.interrupt();
// TRYING TO ADD THE FORM/FILE/PDF GENERATION LOGIC HERE
// ONCE TASK AS FINISHED BY 1 THREAD, WE EXIST FINDING THE THREAD AVAILABLE
break;
}
}
先感謝您。
uj5u.com熱心網友回復:
在現代 Java 中,我們很少需要Thread直接尋址類。相反,我們使用Executors 框架來代表我們管理執行緒。
我正在嘗試為我們的 Java 應用程式創建 10 個執行緒
如果您確信 10 個執行緒適合您部署計算機上的作業負載,那么只需創建一個由 10 個執行緒支持的執行程式服務。
ExecuterService executorService = Executors.newFixedThreadPool( 10 ) ;
順便說一句,如果Loom 計劃成功了,即使是您的這種判斷也可能會消失。新的虛擬執行緒(纖程)將非常“便宜”,以至于我們可以同時運行數千甚至數百萬個執行緒。而且這些虛擬執行緒都將是全新的,無需在池中回收它們。基于早期訪問的 Java 18,使用Project Loom技術的實驗性構建現已可用。
ExecuterService executorService = Executors.newVirtualThreadPerTaskExecutor() ;
讓他們一直活著
不需要那個。讓執行程式服務管理其后備執行緒池。
運行我分配給他們的任務。
將您的任務定義為 aRunnable或 a Callable。
Runnable weeklyReportTask = () -> WeeklyReport :: generate ;
將您的任務實體提交給執行程式服務。
executorService.submit( weeklyReportTask ) ;
我嘗試分配給它們的任務是檔案下載、報告下載和 PDF 下載。
繼續提交任務。執行程式服務負責將任務分配給其后備執行緒池中的執行緒。
executorService.submit( fileDownloadTask ) ;
executorService.submit( weeklyReportTask ) ;
executorService.submit( pdfDownloadTask ) ;
但是,這些檔案生成基于我們系統中的不同引數,因此我無法在 InterruptedException 例外捕獲塊中定義我的檔案生成邏輯。我很好奇是否有辦法中斷執行緒并在不擴展執行緒或實作可運行介面的類中為它們分配不同的任務(函式)?
將您的任務定義為您自己設計的實作Runnable并承載run方法的類的實體。在您的任務類上放置一個建構式,該建構式為影響檔案生成邏輯的那些不同引數接受引數。在實體化任務物件時傳遞引數。然后將任務實體提交給您的執行程式服務。
Runnable然后,您的實作包含完成其作業所需的所有資訊。無需中斷執行緒;甚至不需要特別了解任何執行緒。
所有這些都在 Stack Overflow 上多次解決。搜索以了解更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366710.html
