簡體   English   中英

我可以在這里制作Thread.stop()嗎?

[英]Can I make Thread.stop() here?

我的程序中有這種類型的搜索功能。

有一種搜索方法需要一些時間才能完成,並且應該在單獨的線程上運行,並且當用戶鍵入新字母進行新搜索時,我應該能夠殺死它,但是問題是我使用了第三方的trie實現,不會檢查中斷,我到處都讀到使用Thread.stop()會對程序產生不良影響,所以我的問題是使用此代碼,可以使用thread.stop()了嗎??? 或者,如果還有其他方法可以實現?

 ArrayList search(key)
    {
        Map m = patricaTrie.prefixMap(key);  // 3rd party code cant be modified
        HashSet hs = new HashSet(m.size());
        ArrayList al = new ArrayList();
        for(Object t : collection)
        {
            if(!hs.contains(t))
            {
                al.add(t);
                hs.add(t);
            }
        }
        return al;
    }

在線程中使用信號處理可以正常停止正在運行的線程。 例如:

您可以創建一個布爾字段並在運行中檢查它:

    public class Task implements Runnable {

       private volatile boolean isRunning = true;

       public void run() {

         while (isRunning) {
             //do work
         }
       }

      // public void kill() {
      //  isRunning = false;
      // }

    }

現在,當您想停止該正在運行的線程時,只需設置標志isRunning=false; 傳遞一個指示線程正常停止的信號。

在大多數情況下,殺死線程的唯一“安全”方法是對線程進行編碼,使其可以接收到停止信號。 例如,使用一個名為shouldQuit的布爾變量,並讓Thread定期檢查該變量,如果它是真的,則退出。

當用戶鍵入新字母進行新搜索時,將此布爾值設置為true並退出run方法。

好吧,Thread.stop不會破壞JVM,但是,如果您沒有正確處理代碼(例如,留下垃圾數據,留下損壞的實例等),那么代碼的其他部分可能引用了您使用過的變量在您停止的線程中可能會出現問題。

例如,如果主線程在search()外部引用了線程中正在使用的任何變量Object,則由於對象中存在損壞的數據,因此您的主線程可能行為不當。

因此,建議確保不要使用從外部停止的線程中的任何對象(如果需要的話),然后使用一種方法來識別該對象是否損壞。

暫無
暫無

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

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