为了账号安全,请及时绑定邮箱和手机立即绑定

如何在运行时更改线程的 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 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号