当Java中的线程退出时,runnable类的实例是否被销毁

当Java中的线程退出时,runnable类的实例是否被销毁,java,multithreading,runnable,Java,Multithreading,Runnable,如果有一个类使用以下代码实现可运行类: public class MyRunnable implements Runnable { public Thread t; // Other variables; public MyRunnable() { t = new Thread(this, "MyRunnable Thread"); // Initialise other variables. } public void

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

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.t.start先生()

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

我应该举一个新的例子吗


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

我不喜欢这段代码

您的
Runnable
不应该有
线程
成员,公共或私有。我建议把它去掉。简单想想:分离关注点。这就是您的Runnable应该是什么样子:

public class MyRunnable implements Runnable {
    public void run() {
       //Do something.
    }
}
就这样。让其他知道如何运行的类处理该部分

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


除非你读过Brian Goetz的书并完全理解它,否则你不应该尝试做很多多线程编程。你不太可能遇到麻烦。

我不喜欢这段代码

您的
Runnable
不应该有
线程
成员,公共或私有。我建议把它去掉。简单想想:分离关注点。这就是您的Runnable应该是什么样子:

public class MyRunnable implements Runnable {
    public void run() {
       //Do something.
    }
}
就这样。让其他知道如何运行的类处理该部分

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


除非你读过Brian Goetz的书并完全理解它,否则你不应该尝试做很多多线程编程。您不太可能遇到麻烦。

Runnable具有run()方法,因此您不需要在该方法中使用单独的线程。并且,除非您退出变量(对象)定义的上下文并释放引用,否则不会破坏任何内容


Runnable具有run()方法,因此不需要在该方法中使用单独的线程。除非您退出变量(对象)定义的上下文并释放引用,否则不会破坏任何内容


MyRunnable
中删除对
线程的引用

Java中的起始线程习惯用法如下所示

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

垃圾收集的常规规则适用于清理可运行文件。如果没有对象引用runnable,它可能会被垃圾收集。

MyRunnable
中删除对
线程的引用

Java中的起始线程习惯用法如下所示

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

垃圾收集的常规规则适用于清理可运行文件。如果没有可运行的对象引用,它可能会被垃圾收集。

在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中编写多线程代码有几种习惯用法,请参阅。保持简单和独立:

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风格吗?那该怎么办呢?附言:我从这个链接得到了这种风格:你能告诉我为什么这不是Java的好风格吗?那该怎么办呢?附言:我从这个链接中得到了这种类型的样式:如果我做了如下的事情,那么它是否正确:MyRunnable mr=new MyRunnable();螺纹t=新螺纹(mr);t、 start();然后当我检查(!t.isAlive){t=new Thread(mr);t.start()}时,我基本上不想创建MyRunnable类的新实例。是否可以使用上述方法?如果您的Runnable保留任何状态,那么重用它会变得稍微复杂一些-您需要重新初始化其持久状态。因此,如果我执行以下操作,它是否正确:MyRunnable mr=new MyRunnable();螺纹t=新螺纹(mr);t、 start();然后当我检查(!t.isAlive){t=new Thread(mr);t.start()}时,我基本上不想创建MyRunnable类的新实例。是否可以使用上述方法?如果您的Runnable保留任何状态,那么重用它会变得稍微复杂一些-您需要重新初始化它的持久状态。