【问题标题】:Put Java Threading Class into a separate class将Java Threading Class放到一个单独的类中
【发布时间】:2010-03-13 22:54:56
【问题描述】:

考虑以下 SWT 代码示例:

http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet151.java?view=co

如何分离内联定义的类?

Thread thread = new Thread() {
        public void run() {
            ...
        }
    };

我想定义一个单独的类来更新表格,就像它在这里所做的那样。如何将列表传递回表格?示例代码?

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    只需创建一个class 其中extends Thread

    public class Task extends Thread {
        public void run() {
            // ...
        }
    }
    

    并按如下方式创建它:

    Task task = new Task();
    

    然而,通常的做法是实现Runnable

    public class Task implements Runnable {
        public void run() {
            // ...
        }
    }
    

    或者如果你想要一个返回结果的Thread,实现Callable<T>,其中T代表返回类型。

    public class Task implements Callable<String> {
        public String call() {
            // ...
            return "string";
        }
    }
    

    两者都可以使用ExecutorService 执行。

    【讨论】:

    • 这确实是一个更好的做法,如果你想要一个结果,甚至可能是Callable&lt;T&gt;。然而,这不是他的问题。
    【解决方案2】:

    我不会创建扩展 Thread 的类。您更有可能拥有一个实现 Runnable 并提供对私有数据成员的访问的类:

    public class YourTask implements Runnable
    {
        private ResultClass result;
    
        public void run() { }
    
        public ResultClass getResult() { return result; }
    }
    

    看看 java.util.concurrent 包和新的 FutureTask。我认为这是一个更好的选择。

    【讨论】:

    • 如果要返回结果,也可以考虑Callable而不是Runnable。
    【解决方案3】:

    您可以传递参数或设置全局可见的属性,例如:

    class Foo
    {
      public static String baz = "baz";
      private String bar = "bar";
    
      void startThread()
      {
        MyThread thread = new MyThread(bar);
    
        thread.start();
      }
    }
    
    class MyThread extends Thread
    {
      String ref;
    
      MyThread(String ref)
      {
        this.ref = ref;
      }
    
      public void run()
      {
        // it can work with passed parameter
        System.out.println(ref);
    
        // but also with globally visible variables
        System.out.println(Foo.baz);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2015-02-27
      • 2020-07-17
      • 2021-02-15
      • 1970-01-01
      相关资源
      最近更新 更多