JAvaラーニングノート--スレッドの実行を制御
3264 ワード
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);
}
}