Java 期货和设置内螺纹的区别

Java 期货和设置内螺纹的区别,java,multithreading,future,Java,Multithreading,Future,今天我发现了java中的线程。现在我需要线程对我的gui进行更改。我有两个实现。我不知道他们之间有没有什么大的区别。 但是第一个没有期货的有点“挂起”我的程序。我的gui变得非常迟钝等。第二个似乎更好。谁能告诉我哪一个最好,为什么 Runnable hasherRunnable = new Runnable() { public void run() { notifyObservers(getHasher().hash(input));

今天我发现了java中的线程。现在我需要线程对我的gui进行更改。我有两个实现。我不知道他们之间有没有什么大的区别。 但是第一个没有期货的有点“挂起”我的程序。我的gui变得非常迟钝等。第二个似乎更好。谁能告诉我哪一个最好,为什么

Runnable hasherRunnable = new Runnable() {
        public void run()  {

            notifyObservers(getHasher().hash(input));

        }};

        this.getPool().submit(hasherRunnable,"hasherThread");
    Callable<String> callableHasher=new Callable<String>(){
        public String call(){
            return getHasher().hash(input);
        }
    };
    ============================================================
    Future<String> future = this.getPool().submit(callableHasher);
    try {
        notifyObservers(future.get());
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Runnable hasherRunnable=new Runnable(){
公开募捐{
notifyobsers(getHasher().hash(input));
}};
this.getPool().submit(hasherRunnable,“hasherThread”);
Callable callableHasher=new Callable(){
公共字符串调用(){
返回getHasher().hash(输入);
}
};
============================================================
Future=this.getPool().submit(callableHasher);
试一试{
notifyobsers(future.get());
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(执行例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}

您不应该从事件调度线程(EDT)以外的任何线程更新GUI。要在EDT上运行runnable,请使用:

EventQueue.invokeLater( new Runnable(){
             @Override
             public void run() {

             }
        });
Swing还有
SwingWorkers
,它们是工作线程,您可以使用它们在EDT之外执行耗时的操作,并将更新返回GUI。您可以这样使用它们:

   new SwingWorker<T,T>(){
        @Override
        public Void doInBackground(){
           return t;  //Object of some type T 
        }

       @Override
       public void done() {
          try {
              T somVariable = get();
              // Use someVariable to update the GUI 
           }
          catch (InterruptedException ignore) {
             // handle exception
          }
          catch (java.util.concurrent.ExecutionException e) {
            // handle exception
          }
       }.execute();
newswingworker(){
@凌驾
公共无效doInBackground(){
返回t;//某种类型的对象t
}
@凌驾
公众假期结束(){
试一试{
T somVariable=get();
//使用someVariable更新GUI
}
捕获(中断异常忽略){
//处理异常
}
catch(java.util.concurrent.executione){
//处理异常
}
}.execute();

SwingWorkers
使处理未来变得更加容易。有关这些方面的更多信息,请阅读on worker线程。

您不应该从事件调度线程(EDT)以外的任何线程更新GUI。要在EDT上运行runnable,请使用:

EventQueue.invokeLater( new Runnable(){
             @Override
             public void run() {

             }
        });
Swing还有
SwingWorkers
,它们是工作线程,您可以使用它们在EDT之外执行耗时的操作,并将更新返回GUI。您可以这样使用它们:

   new SwingWorker<T,T>(){
        @Override
        public Void doInBackground(){
           return t;  //Object of some type T 
        }

       @Override
       public void done() {
          try {
              T somVariable = get();
              // Use someVariable to update the GUI 
           }
          catch (InterruptedException ignore) {
             // handle exception
          }
          catch (java.util.concurrent.ExecutionException e) {
            // handle exception
          }
       }.execute();
newswingworker(){
@凌驾
公共无效doInBackground(){
返回t;//某种类型的对象t
}
@凌驾
公众假期结束(){
试一试{
T somVariable=get();
//使用someVariable更新GUI
}
捕获(中断异常忽略){
//处理异常
}
catch(java.util.concurrent.executione){
//处理异常
}
}.execute();

SwingWorkers
使处理未来变得更加容易。有关这些方面的更多信息,请阅读on worker线程。

您不应该从事件调度线程(EDT)以外的任何线程更新GUI。要在EDT上运行runnable,请使用:

EventQueue.invokeLater( new Runnable(){
             @Override
             public void run() {

             }
        });
Swing还有
SwingWorkers
,它们是工作线程,您可以使用它们在EDT之外执行耗时的操作,并将更新返回GUI。您可以这样使用它们:

   new SwingWorker<T,T>(){
        @Override
        public Void doInBackground(){
           return t;  //Object of some type T 
        }

       @Override
       public void done() {
          try {
              T somVariable = get();
              // Use someVariable to update the GUI 
           }
          catch (InterruptedException ignore) {
             // handle exception
          }
          catch (java.util.concurrent.ExecutionException e) {
            // handle exception
          }
       }.execute();
newswingworker(){
@凌驾
公共无效doInBackground(){
返回t;//某种类型的对象t
}
@凌驾
公众假期结束(){
试一试{
T somVariable=get();
//使用someVariable更新GUI
}
捕获(中断异常忽略){
//处理异常
}
catch(java.util.concurrent.executione){
//处理异常
}
}.execute();

SwingWorkers
使处理未来变得更加容易。有关这些方面的更多信息,请阅读on worker线程。

您不应该从事件调度线程(EDT)以外的任何线程更新GUI。要在EDT上运行runnable,请使用:

EventQueue.invokeLater( new Runnable(){
             @Override
             public void run() {

             }
        });
Swing还有
SwingWorkers
,它们是工作线程,您可以使用它们在EDT之外执行耗时的操作,并将更新返回GUI。您可以这样使用它们:

   new SwingWorker<T,T>(){
        @Override
        public Void doInBackground(){
           return t;  //Object of some type T 
        }

       @Override
       public void done() {
          try {
              T somVariable = get();
              // Use someVariable to update the GUI 
           }
          catch (InterruptedException ignore) {
             // handle exception
          }
          catch (java.util.concurrent.ExecutionException e) {
            // handle exception
          }
       }.execute();
newswingworker(){
@凌驾
公共无效doInBackground(){
返回t;//某种类型的对象t
}
@凌驾
公众假期结束(){
试一试{
T somVariable=get();
//使用someVariable更新GUI
}
捕获(中断异常忽略){
//处理异常
}
catch(java.util.concurrent.executione){
//处理异常
}
}.execute();

SwingWorkers
使处理未来变得更加容易。有关这些方面的更多信息,请阅读工作线程上的内容。

我希望线程对我的gui进行不允许的更改。只有一个线程可以更新UI,那就是事件调度线程。请参阅教程我的gui正在“观察”一个类,它是开始一个新线程。该新线程运行一个带有字符串的notifyObserver。然后该字符串显示在gui上。它可以工作。为什么不允许?我怎么可能解决这个问题?你不能解决这个问题,这是Swing的工作方式。那么我如何从程序代码更改gui?我的gui需要对我的代码做出反应,我猜:/。在第二个示例中:更改I我想,这是由“普通”线程完成的,哪一个更好?我希望线程对我的gui进行不允许的更改。只有一个线程可以更新UI,那就是事件调度线程。请参阅教程我的gui正在“观察”一个类,该类将启动一个新的