亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在運行時更改線程的 Runnable 目標

如何在運行時更改線程的 Runnable 目標

ITMISS 2022-12-28 14:04:31
我想用 Java 構建自己的 ExecutorService,它能夠“提交(可調用任務)”給定任務。我打算使用一個包含多個“線程(可運行目標)”的線程池。這個想法是創建固定數量的線程,這些線程從已由“提交”方法填充的列表中取出 FutureTask 對象。FutureTask 對象也在提交方法中創建。我的問題是我只能在創建線程時(通過構造函數)將一個Runnable對象(這里:FutureTask)交給一個線程,但顯然FutureTasks需要動態分配給一個線程(當項目從列表中刪除時). 有什么辦法嗎?// content of submit, parameter: myTaskFutureTask<V> newFutureTask = new FutureTask<V>(myTask);taskQueue = new BlockingQueue<FutureTask<V>>();try {    taskQueue.put(newFutureTask);} catch (InterruptedException ex) { }return newFutureTask;// remove item from list and hand it over to thread// method within MyThread extends Thread (thread pool) classvoid exec() {    FutureTask<V> task;    try {        task = taskQueue.take();        // TODO: run task somehow????        } catch(InterruptedException ex) { }}
查看完整描述

2 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

看一段偽代碼:


while (true) {

   task = fetch task

   If no task: wait/yield

   Else: execute task 

}

換句話說:您只需實現一個run()方法,該方法循環并執行任何Runnable(或傳遞給它的任何內容)的 run 方法。如果沒有工作可用,則該方法會休眠或等待通知。


查看完整回答
反對 回復 2022-12-28
?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

首先,FutureTask是Runnable,所以你可以task.run();在// TODO.


其次,你根本不需要taskQueue = new BlockingQueue<FutureTask<V>>();。將您的實現ExecutorService作為對現有Executor:的補充


class MyExecutorService implements ExecutorService {


   private final Executor executor;


   public MyExecutorService(Executor executor) {

       this.executor=executor;

   }


   public Future<?> submit(Runnable task) {

       FutureTask task = new FutureTask(task);

       executor.exec(task);

       return task;

   }

}


查看完整回答
反對 回復 2022-12-28
  • 2 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號