-1

このサイトで私の質問に対する答えを探しました。しかし、毎ターン失敗しました。これを 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));
        }
    }
4

2 に答える 2

1

EJB は思ったより強力であることがわかりました。アプリケーションをバッキング スレッドで分離するメソッドの上に @Asyncronus を追加するだけで、別のスレッドとして機能し、ユーザーはプロセスの終了を待たずにやりたいことを続けることができます。

 @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));
      }


 }
于 2014-08-05T14:31:55.817 に答える
0

Executor を使いたい場合は、java-ee-7 でManagedExecutorServiceが導入されました

Java EE 7チュートリアルから

ManagedExecutorService: マネージド エグゼキュータ サービスは、送信されたタスクを非同期的に実行するためにアプリケーションによって使用されます。タスクは、コンテナーによって開始および管理されるスレッドで実行されます。コンテナーのコンテキストは、タスクを実行するスレッドに伝達されます。たとえば、ManagedExecutorService.submit() 呼び出しを使用して、GenerateReportTask などのタスクを送信して後で実行し、Future オブジェクト コールバックを使用して、結果が利用可能になったときに結果を取得できます。

コードサンプル:

public class MyClass {

    @Resource
    private ManagedExecutorService mes;


    public void myMethod() {
        mes.execute(new Worker());
    }
}
于 2014-08-05T14:46:45.090 に答える