gpt4 book ai didi

Java 异常 : ThreadPoolExecutor$Worker incompatible with com. myco.TaskListEntry

转载 作者:行者123 更新时间:2023-11-29 03:36:44 27 4
gpt4 key购买 nike

在 Java 中,我得到一个转换异常:

java.lang.ClassCastException: java.util.concurrent.ThreadPoolExecutor$Worker
incompatible with com.myco.TaskListEntry
at com.myco.JobThreadFactory.newThread(JobThreadFactory.java:17)

代码如下:

public class JobThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
TaskListEntry entry = (TaskListEntry)r; //<== Cast exception!
return new Thread(r, "Thread for " + entry.toString());
}
}

@DisallowConcurrentExecution
public class WorksheetSessionJob implements Job {
private List<TaskListEntry> taskListEntries;

@Override
public void execute(JobExecutionContext jobContext) throws JobExecutionException {
ThreadFactory threadFactory = new JobThreadFactory();
ExecutorService executor = Executors.newCachedThreadPool(threadFactory);
for( TaskListEntry nextEntry : getWorkListEntries() ) {
executor.execute(nextEntry);
}
}

private List<TaskListEntry> getWorkListEntries() {
List<TaskListEntry> entries = new ArrayList<TaskListEntry>();

// TODO Get rows from DB - for now, make something up to test with
//-- beginning of fake data creation ----------
TaskListEntry entry = new TaskListEntry("0022", "04590150560", "DI_MODULAR", 1);
entries.add(entry);
entry = new TaskListEntry("0007", "04590150560", "DI_MODULAR", 2);
entries.add(entry);
//-- end of fake data creation ----------------

return entries;
}

}

public class TaskListEntry implements Runnable {
private String worksheetNumber;
private String specimenNumber;
private String instrumentName;
private int id;

public TaskListEntry(String worksheetNumber,
String specimenNumber, String instrumentName, int id) {
super();
this.worksheetNumber = worksheetNumber;
this.specimenNumber = specimenNumber;
this.instrumentName = instrumentName;
this.id = id;
}

@Override
synchronized public void run() {
// executor in my Job should have created a thread for me to run in
//-- TESTING ONLY -------------
try {
Thread.sleep(10000); //force execution to another thread?
} catch (InterruptedException e) {
e.printStackTrace();
}
//-- END OF TESTING -----------
}

}

为什么我的 TaskListEntry runnable 没有被发送?我需要使用该类的值来命名相应的线程。我究竟做错了什么?!

最佳答案

您遇到了转换问题,因为当调用线程工厂时,您的 Runnable 没有与 ThreadPoolExecutor$Worker 类相关联。 Worker Runnable 是一个内部执行器类,它从保存您的 TaskListEntry 实例的内部 BlockingQueue 中取出任务。您的任务无法通过设计与特定线程相关联。如果您将 10 万个任务提交到队列中,您不会希望它产生 10 万个线程——这就是使用线程池的全部意义所在。

如果您试图以某种方式跟踪哪些线程正在处理哪些任务,我建议在 TaskListEntry 中记录线程 ID (Thread.currentThread().getId()) .run() 方法。但是,如果您试图以某种方式在线程名称中查看每个任务,那么您就没有理解线程池的工作原理。通常,我使用 ThreadFactory 设置池线程的名称以标识池名称。像 "TaskListEntry pool-1" 之类的东西在这里是合适的线程名称。

如果您详细说明您在名称方面想要完成的工作,我们或许能够提供更多帮助。

关于Java 异常 : ThreadPoolExecutor$Worker incompatible with com. myco.TaskListEntry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15123481/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com