当Thread在Java中退出时,是否会破坏runnable类的实例

时间:2013-06-07 09:53:35

标签: java multithreading runnable

如果有一个类使用以下代码实现runnable类:

public class MyRunnable implements Runnable {
    public Thread t;
    // Other variables;

    public MyRunnable() {
        t = new Thread(this, "MyRunnable Thread");
        // Initialise other variables.
    }

    public void run() {
       //Do something.
    }
}

我正在以下列方式制作上述类的实例:

public class MyFunc () {
  satic void main (String ards[]) {
     MyRunnable mr = new MyRunnable();
     mr.t.start();


     while (true) {
         Thread.sleep(10000);
         if (!mr.isAlive()) {
              //Execute mr again.
              // How to do it ?
         }
     }
  }
}

我该怎么做?

我有两种方法,但不确定哪一种是正确的:

1。 mr.t.start();

2. MyRunnable mr = new MyRunnable();         mr.t.start();

我应该创建一个新的mr实例吗?

或者我应该使用现有的实例还是mr?

4 个答案:

答案 0 :(得分:3)

Thread删除对MyRunnable的引用。

在Java中启动线程习惯看起来像这样

new Thread(new MyRunnable()).start()

垃圾收集的正常规则适用于清理runnables。如果没有对象引用runnable,则可能是垃圾回收。

答案 1 :(得分:1)

在Java中编写多线程代码有几个习惯用法,请参阅Java tutorials。保持简单和分离:

public class YourTask implements Runnable {
   @Override
   public void run() {
      // do something
   }
}

最小的示例应用程序:

public class YourApp {

public static void main(final String[] args) throws InterruptedException {

    final YourTask yourTask = new YourTask();
    final Thread thread = new Thread(yourTask);
    thread.start();

    thread.join();
   }
}

注意并发性 - 在正确理解之前,不要在生产中使用此代码,例如阅读Java Concurrency in Practice

答案 2 :(得分:0)

我不喜欢这段代码。

您的Runnable不应该有Thread成员,公共或私人。我建议删除它。想一想:关注点分离。这就是你的Runnable应该是这样的:

public class MyRunnable implements Runnable {
    public void run() {
       //Do something.
    }
}

那就是它。让其他知道如何运行的类处理那个部分。

您最好不要查看较新的并发包类,例如Executor

你不应该尝试做很多多线程编程,除非你已经读过Brian Goetz' "Java Concurrency In Practice"并彻底理解。你不太可能遇到麻烦。

答案 3 :(得分:0)

Runnable有方法run(),所以你不需要在那里单独的Thread.And什么都不会被破坏,除非你从变量(对象)定义的上下文出去并且你松开了引用。

http://www.javamex.com/tutorials/threads/thread_runnable_construction.shtml