JAvaラーニングノート--スレッドの実行を制御

3264 ワード

  • スレッドの制御は一般的で、ファイルが半分に転送された場合、ファイル転送を一時停止したり、ファイル転送を終了したりする必要があります.これは実際には制御スレッドの実行です.
  • スレッドには、作成、実行可能、実行中、ブロック、死亡の5つのステータスがあります.作成:new演算子を使用してスレッドを作成して実行します.startメソッドを使用してスレッドを起動すると、システムはリソース実行中の状態を割り当てます.スレッドを実行するrunメソッドがブロックされます.実行するスレッドは何らかの理由で停止して死亡状態を実行し続けます.スレッド終了
  • 従来手法のセキュリティ問題Threadのstop(),suspend(),resume(),destroy()手法は,安全でないためデッドロックを引き起こす可能性があり,既に使用されていない.
  • スレッドの実行をどのように制御するか例を挙げると、あるファイルの転送に10 sが必要であれば、ある時点で転送を一時停止させ、転送が完了するまで続行する.Runnableを実装する方法で完了し、まずファイル転送のRunnableクラス
  • である.
  • コードは次のとおりです:
  • public class ThreadControlTest1 implements Runnable
    {
     private int percent = 0;
     public void run()
     {
      while(true)
      {
       System.out.println("    :"+ percent +"%");
       try
       {
        Thread.sleep(1000);
       }
       catch(Exception ex)
       {}
       percent += 10;
       if(percent == 100)
       {
        System.out.println("    ");
        break;
       }
      }
     }
     public static void main(String[] args)
     {
      ThreadControlTest1 ft = new ThreadControlTest1();
      Thread th = new Thread(ft);
      th.start();
     }
     
    }
    が実行され、コンソール上で印刷ファイルが転送されるシミュレーションプロセス.クラスオブジェクトをスレッドで実行すると、whileループが10回実行されて終了することがわかります.しかし、ある時点(例えば5秒後)でスレッドの実行を一時停止(例えば1分)する必要がありますが、Threadの関連関数は使用できません.どうすればいいですか?この問題を解決するには、よくある方法は以下の通りです.一時停止が必要な場合、いっそスレッドのrunメソッドを終了させてリソースを解放する(実際にはスレッドを永久に終了させる).スレッドが続行する必要がある場合、新しいスレッドを開いて動作を継続するにはrunメソッドをどのように終了させるか、runメソッドにはwhileループがあり、ループを変更するフラグをtrueからfalseに変更すればよい.
  • 上のコードは、
  • に変更できます.
  • public class ThreadControlTest1 implements Runnable
    {
     private int percent = 0;
     private boolean isRun = true;
     public void run()
     {
      while(isRun)
      {
       System.out.println("    :"+ percent +"%");
       try
       {
        Thread.sleep(1000);
       }
       catch(Exception ex)
       {}
       percent += 10;
       if(percent == 100)
       {
        System.out.println("    ");
        break;
       }
      }
     }
     public static void main(String[] args) 
     {
      ThreadControlTest1 ft = new ThreadControlTest1();
      Thread th = new Thread(ft);
      th.start();
      try
      {
       Thread.sleep(5000);
      }catch(Exception ex)
      {}
      ft.isRun = false;
      System.out.println("     ");
      try
      {
       Thread.sleep(1000*60);
      }catch(Exception ex)
      {}
      ft.isRun = true;
      th = new Thread(ft);
      th.start();
     }
     
    }
    テスト練習:既存のプログラムは、1ミリ秒おきにインタフェースに「hello」を印刷する必要があります.同時に、プログラムも1+2+3+...100000、計算が終わったら出力します.加算結果を出力するとHelloは印刷されず、あるスレッドの中で別のスレッドを停止することに相当します.私のコードは次のとおりです:
  • public class PrintHelloThread extends Thread
    {
     public  static void  SetPrintHelloThreadFlag(boolean flag)
     {
      isPrint = flag;
     }
     private static boolean isPrint = true;
     public void run()
     {
      try
      {
       while(isPrint)
       {
        Thread.sleep(1);
        System.out.println("Hello");
       }
      }
      catch(Exception ex)
      {}
     }
     public  static void main(String[] args)
     {
      PrintHelloThread printThread = new PrintHelloThread();
      CaculateRunnable r = new CaculateRunnable();
      Thread t = new Thread(r);
      printThread.start();
      t.start();
      
     }
    }
    class CaculateRunnable implements Runnable
    {
     public void run()
     {
      int sum =0;
      for(int i = 0;i<1000000;i++)
      {
       sum +=i;
      }
      System.out.println("sum = "+sum);
      PrintHelloThread.SetPrintHelloThreadFlag(false);
      
     }
    }