在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被发送?我需要使用该类的值来命名相应的线程。我究竟做错了什么?!
感谢您的回复。我知道你在说什么关于池使用更小的线程实例反复。我试图做的是有一个更有意义的方式来查看在调试时发生了什么/发生了什么,特别是在问题发生后查看日志文件。对此有何建议? – Mark 2013-02-28 13:21:06
正如我在答案中提到的那样,我会在线程池线程上设置一个好名字,以显示它们与TaskListEntry处理相关联,并在日志中记录线程ID以显示正在处理的内容。这就是你所能做的一切。 – Gray 2013-02-28 13:22:57