簡體   English   中英

在java中從父線程殺死子線程

[英]Killing child thread from parent thread in java

我在 java android 平台上工作。 我正在從主線程創建一個子線程。 我想停止子線程作為我的要求。 我的子線程具有簡單的函數,沒有任何循環。 我想隨時終止子線程並釋放它正在使用的資源。 我搜索它並找到了 inturrupt() 函數。 我的線程是:

public class childThread implements Runnable{
  public void run() {
     firstFunction();
     secondFunction();
    }
}

主線程有此代碼在線程上方啟動:

Thread tChild;
tChild = new Thread(new childThread(), "Child Thread");
tChild.start();

我的run()函數正在調用這樣的函數。 我如何在這使用interrupt() 請告訴我任何其他殺死子線程並釋放其資源的方法。

通過線程的協作,您可以使用它支持的任何方法停止該線程。 沒有線程的配合,就沒有理智的方法來阻止它。 例如,考慮線程是否持有鎖並將共享資源置於無效狀態。 沒有它的合作,你怎么能停止那個線程?

你有兩個選擇:

  1. 對您的線程進行編碼,以便它們不執行您不希望它們執行的工作。 對它們進行編碼,以便它們在無事可做時自行終止。 這樣,他們就不需要其他線程從外部“伸入”。

  2. 對您的線程進行編碼,以便它們提供某種方式來告知它們應該終止,然后干凈地終止。

但這些是你的選擇——它不能靠魔法起作用。

想想一個線程在做工作,就像你姐姐借你的車一樣。 如果你需要車回來,你需要你姐姐的配合才能把它拿回來。 你可以安排她自己在你需要車的時候回來,或者你可以安排你告訴她你什么時候需要車,然后她回來。 但是你不能改變這樣一個事實,她必須知道如何把車開回來,否則它就回不來了。

線程操縱進程資源並將它們置於無效狀態。 他們必須在終止之前修復事物,否則進程上下文將被破壞。

由於您沒有任何循環,因此請檢查 Thread.interrupted() 值,我假設您的 firstFunction(); secondFunction();,做一個繁重的工作,你將不得不檢查函數 firstFunction(); 中的適當點; 第二個函數(); 條件 Thread.interrupted(),如果為真則結束該方法。 我知道你沒有循環,但從概念上講是這樣的,

    Runnable runnable = new Runnable() {
      private int counter;

      public void run() {
        while(true){
          System.out.println(">> Executing " + counter++);

          if(Thread.interrupted()){
            break;
          }
        }

      }
    };

    Thread thread = new Thread(runnable);
    thread.start();

    Thread.sleep(10 * 1000);

    thread.interrupt();

您的子線程需要定期檢查Thread.interrupted()並在返回 true 時退出。

你的代碼是否有循環並不重要。 你只需要在你的代碼執行路徑中選擇不同的點,看看是否需要取消。

只需在 tChild 對象上調用中斷,它就會中斷您的子線程

Thread tChild;
tChild = new Thread(new childThread(), "Child Thread");
tChild.start();
//...
tChild.interrupt();

用 try catch 包圍你的代碼。 Catch for InterruptedException 然后出來。 如果有循環,將 catch 語句放在循環外/如果 catch 在里面,則中斷循環。

    Runnable runnable = new Runnable() {  
      public void run() {  
          try {  
               while(true) {  
                    // your code  
               }                   
           }(InterruptedException e) {  
                // It comes out   
           }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM