JavaFx Task与使用Task创建新线程之间有什么区别

时间:2015-04-07 14:14:25

标签: java multithreading javafx task

我有一个General类,它有静态方法和静态变量,Hibernate配置设置和方法在命中数据库后返回List。我正在研究JavaFx,我最近学会了更好地使用Task进行耗时的操作,例如点击数据库获取一长串数据等。 所以,在我的情况下,我创建了一个Task对象,在匿名内部类中编写代码,其中包含用于访问LOGIN凭据的db的代码。 Task必须返回List的实例。 我在静态方法中初始化了一个Thread对象,在其构造函数中传递了Task对象,将守护进程设置为true并启动了Thread。但是我在运行应用程序后得到NullPointerException。

private static SessionFactory sessionFactory = null;
private static Session session = null;
private static final Transaction transaction = null;
private static final Configuration configuration = null;
private static List list;
  public static List getSelectList(final String query)
  {
      //list = null;
      System.err.println("Inside getSelectList");
      try{
      final Task <List> task= new Task <List> ()
      {
          @Override
          public List call()
          {
              try
              {
                 System.err.println("Inside call");
                 session.beginTransaction();
                 list = session.createQuery(query).list();
                 System.err.println(list);


                 session.getTransaction().commit();
                 return list;
              }
                catch (Exception e)
                {
                     session.getTransaction().rollback();
                     e.printStackTrace();
                }
              System.err.println("Outta try block");
              return null;
          }
      };

      task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
          @Override
          public void handle(WorkerStateEvent t) {
              System.err.println("Inside handle");
             list = task.getValue();
            /* for (Iterator it = list.iterator();it.hasNext(); )
                 {
                  System.err.println("Inside Set on succeeded");
                  //System.err.println( ((Login)it.next()).getUsername());   
                 } */
             }
            });

     Thread th = new Thread(task);
     th.setDaemon(true);
     th.start();


     //list=task.getValue();

      }
      catch (Exception e) {e.printStackTrace();}
      return list;

  }

Exception which i got

但是,在经过多次组合和随机排列之后,对于我来说,通过评论线程代码而不是用task.run()代替它是有用的。

 /*Thread th = new Thread(task);
     th.setDaemon(true);
     th.start();*/
task.run();

另外我不得不改变局部变量List list = session.createQuery(query).list();通过声明静态列表列表;并初始化此静态列表= session.createQuery(query).list();因为即使我删除了线程代码并添加了task.run()

,它也会抛出异常
 try
              {

                 session.beginTransaction();
                 //List locallist = session.createSQLQuery(query).list();
                 list = session.createSQLQuery(query).list();
                 session.getTransaction().commit();
                 return list ;
              }
                catch (Exception e){
                     session.getTransaction().rollback();

我想知道为什么会这样。为什么task.run()和静态List一起为我工作?

将List转换为static并删除Thread实例并使用task.run();仅仅是为了让我的代码能够工作而从我这边尝试不同的数字。我不知道原因。 任何解释都会让我感到非常谦卑。提前谢谢。

0 个答案:

没有答案