繁体   English   中英

当线程在Java中退出时,可运行类的实例是否被破坏?

[英]Does instance of runnable class gets destroyed when Thread exits in Java

如果有一个使用以下代码实现可运行类的类:

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();

我应该重新创建先生先生吗?

还是我应该与现有实例或先生一起工作?

MyRunnable删除对ThreadMyRunnable

在Java中启动线程成语看起来像这样

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

垃圾收集的一般规则适用于清理可运行对象。 如果没有可运行的对象引用,则可能会对其进行垃圾回收。

关于用Java编写多线程代码有许多习惯用法,请参阅Java教程 保持简单和分开:

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)之前,不要在生产中使用此代码。

我不喜欢这个代码。

您的Runnable不应具有公开或私有的Thread成员。 我建议将其删除。 简单思考:关注点分离。 这是您的Runnable应该看起来像的样子:

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

而已。 让其他知道如何运行事物的类来处理该部分。

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

除非您已阅读Brian Goetz的“ Java Concurrency In Practice”并已充分理解它,否则您不应该尝试进行大量的多线程编程。 您不太可能遇到麻烦。

Runnable具有run()方法,因此您无需在其中使用单独的Thread,除非您从变量(对象)定义的上下文中退出并松开引用,否则不会破坏任何线程。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM