Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;“路由”;threadpoolexecutor中的任务_Java_Multithreading_Threadpool_Threadpoolexecutor - Fatal编程技术网

Java &引用;“路由”;threadpoolexecutor中的任务

Java &引用;“路由”;threadpoolexecutor中的任务,java,multithreading,threadpool,threadpoolexecutor,Java,Multithreading,Threadpool,Threadpoolexecutor,我有一个实现Runnable的类 public class MyRunnable implements Runnable { private long RID = <SOME_LONG_ID_VALUE>; public long getRID() { return this.RID; } public void run { System.out.println("HAI!"); } } 公共类MyRunnable实现Runnable

我有一个实现Runnable的类

public class MyRunnable implements Runnable {
    private long RID = <SOME_LONG_ID_VALUE>;
    public long getRID() { return this.RID; }
    public void run {
        System.out.println("HAI!");
    }
}
公共类MyRunnable实现Runnable{
私人长里德=;
public long getRID(){返回this.RID;}
公开募捐{
System.out.println(“HAI!”);
}
}
是否有一种方法可以通过
RID
字段在
ThreadPoolExecutor
中“路由”任务(我的意思是,如果线程n3运行Runnable with
RID=1
,那么下次tast with
RID=1
必须由线程n3执行(如果它处于活动状态))
谢谢。

好吧,我不认为避免比赛条件(正如你评论中提到的那样)会有任何帮助。待办事项:

如果线程N3不再存在,ThreadPoolExecutor必须创建具有“id”3的新线程。若线程繁忙,则在线程空闲之前不得执行此任务

ThreadPoolExecutor
为您执行线程管理。要实现上述功能,使用现有库是不可能的,您可能需要创建自己的库来实现。如果您的逻辑和线程安全依赖于
RID
,那么我建议您使用RID和ReentrantLock的映射,如下所示:

ConcurrentHashMap<Long, ReentrantLock> map = new ConcurrentHashMap<Long, ReentrantLock>();

public synchornized ReentrantLock getLock(Long id){
    ReentrantLock lock = map.get(id);
    if(lock!=null)
       return lock;
    else{
       map.put(id, new ReentrantLock());
 }
ConcurrentHashMap=新的ConcurrentHashMap();
公共同步化可重入锁定getLock(长id){
ReentrantLock lock=map.get(id);
if(lock!=null)
返回锁;
否则{
put(id,new ReentrantLock());
}
Runnable
中,您可以将
锁定到所需的位置,并相应地进行同步


我认为使用线程池的线程id进行同步是一个非常糟糕的主意。很多时候,生活会简单得多。

好吧,我不认为避免竞争条件(如您的评论中所述)会有任何帮助。Todo:

如果线程N3不再存在,ThreadPoolExecutor必须创建“id”为3的新线程。如果线程正忙,则在线程恢复之前不得执行此任务

ThreadPoolExecutor
为您执行线程管理。要执行上述操作,现有库不可能执行,您可能需要创建自己的库来执行。如果您的逻辑和线程安全依赖于
RID
,我宁愿推荐使用RID和ReentrantLock的映射,类似这样的东西:

ConcurrentHashMap<Long, ReentrantLock> map = new ConcurrentHashMap<Long, ReentrantLock>();

public synchornized ReentrantLock getLock(Long id){
    ReentrantLock lock = map.get(id);
    if(lock!=null)
       return lock;
    else{
       map.put(id, new ReentrantLock());
 }
ConcurrentHashMap=新的ConcurrentHashMap();
公共同步化可重入锁定getLock(长id){
ReentrantLock lock=map.get(id);
if(lock!=null)
返回锁;
否则{
put(id,new ReentrantLock());
}
Runnable
中,您可以将
锁定到所需的位置,并相应地进行同步


IMHO使用线程池的线程id进行同步是一个非常糟糕的主意。很多时候,生活会简单得多。

据我所知,对于每个RID,您都有一个执行上下文,并且希望根据该上下文串行执行所有
MyRunnable
对象

您的错误是试图将该上下文链接到线程。最好使用参与者来表示该上下文。您可以使用广为人知的参与者框架,如Akka,但出于您的目的,simple可以工作

编辑:
另一种观点:由于Actor实现有唯一的接口方法
execute
,因此可以将其视为串行执行器,以串行方式运行提交的任务。由于它没有自己的线程池,但使用另一个在所有Actor之间共享的执行器,因此可以将其称为辅助执行器。

据我所知,对于每个执行器您有一个执行上下文,并且希望根据该上下文串行执行所有
MyRunnable
对象

您的错误是试图将该上下文链接到线程。最好使用参与者来表示该上下文。您可以使用广为人知的参与者框架,如Akka,但出于您的目的,simple可以工作

编辑:
另一种观点:由于Actor实现只有接口方法
execute
,因此可以将其视为串行执行器,以串行方式运行提交的任务。由于它没有自己的线程池,但使用另一个在所有Actor之间共享的执行器,因此可以将其称为辅助执行器。

使用执行器服务数组每个线程运行一个线程。然后根据ID的模数
%
分配任务(假设原始ID为long/int或哈希代码)相对于某个所需的最大大小,并将该结果用作新ID,这样您就可以在处理过程中获得大量并发性的同时,在最终得到过多的executor服务对象之间取得平衡


h22的答案的原意是:

使用一个执行器服务数组,每个线程运行一个线程。然后根据ID的模数
%
分配任务(假设原始ID为long/int或哈希代码)相对于某个所需的最大大小,并将该结果用作新ID,这样您就可以在处理过程中获得大量并发性的同时,在最终得到过多的executor服务对象之间取得平衡


h22回答的原始想法:

这样做的目的是什么?我看不到。可能有很多情况,如果N3很忙或不再存在,会发生什么情况等。用两个词来说——目的是避免竞争条件,并使用相同的RID执行MyRunnables,以便将它们提交给ThreadPoolExecutor。关于上述情况:I如果线程N3不再存在,ThreadPoolExecutor必须创建具有“id”的新线程3.如果线程正忙,则在线程空闲之前不得执行此任务。这样做的目的是什么?我看不到。可能有很多情况,如果N3正忙或不再存在,会发生什么情况等。换句话说,目的是避免争用条件,并使用相同的RID执行MyRunnables,以便将它们提交给ThreadPoolExecut关于上述情况:如果线程N3不再存在,ThreadPoolExecutor必须创建