我在这个网站上搜索了我的问题的一些答案;但每次都失败了。如果我不把它放在ExecutorService中,我可以删除,但如果我这样做,它就不会删除。只有记录仍在数据库中才会发生错误。请指教。
public void deleteAllTrials(List<Trials>list) {
threadList = list;
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.execute(new Job1());
executor.shutdown();
}
public class Job1 implements Runnable {
@Override
public void run() {
//Session session = (Session) entityManager.getDelegate();
EntityManagerFactory emf = entityManager.getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
System.out.println("Size of threadList" + threadList.size());
long start = System.currentTimeMillis();
for(int i =0; i<threadList.size(); i++){
System.out.println("In thread...");
Trials mergedEntity = em.merge(threadList.get(i));
em.remove(mergedEntity);
}
//System.out.println("Result list in service:" + list.size());
//em.close();
long end = System.currentTimeMillis();
System.out.println("Threads took this long:" + (end - start));
}
}
答案 0 :(得分:1)
我发现EJB比我想象的更强大。如果您只是在希望应用程序在后备线程中分离的方法之上添加@Asynchronus,它将作为一个单独的线程,允许用户继续执行他想要做的事情而无需等待该过程完成。
@Asynchronous
public void deleteAllTrials(List<TrialBillet>list) {
List<TrialBillet> threadList = new ArrayList<TrialBillet>();
threadList = list;
for(int i =0; i<threadList.size(); i++){
this.delete(threadList.get(i));
}
}
答案 1 :(得分:0)
如果您想使用执行者,java-ee-7已经引入了ManagedExecutorService
来自Java EE 7教程
ManagedExecutorService:托管执行程序服务由。使用 应用程序异步执行提交的任务。 任务是 在由容器启动和管理的线程上执行。 容器的上下文传播到执行该操作的线程 任务。例如,通过使用ManagedExecutorService.submit()调用,a 任务,例如GenerateReportTask,可以提交执行 稍后再使用Future对象回调,检索 它变得可用时的结果。
代码示例:
public class MyClass {
@Resource
private ManagedExecutorService mes;
public void myMethod() {
mes.execute(new Worker());
}
}