簡體   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