思考
1.クラスの実行スレッドを作成することにより、
実行スレッドの子スレッドを実行する実行時間()メソッド2.書き換えのスレッドとして新しいスレッドを作成します。
3.子スレッド.setDaemon(真)は、デーモンスレッドとしてサブスレッドを設定し、必ず子スレッドを作る実行のスレッドの終了時に最後に来て
4.通常の状況を確認するために、スレッドの子スレッド.join()を実行した後、ビジネス・ロジックのスレッドの実行が死を前に完了した噴火
5.子スレッド.join()が実行.inrerrupt(のスレッドである)は、サブスレッドの終了に伴って、実行の終了スレッドを中断するとき
ビジネスコードセクション
パッケージcom.dwz.concurrency.chapter6。 パブリック クラスThreadService { プライベートスレッドexecuteThread。 プライベート ブール完成= 偽; 公共 ボイドが{(Runnableをタスク)を実行します executeThread = 新しいスレッド(){ @オーバーライド 公共 のボイドの実行(){ スレッドランナーは = 新しいスレッド(タスク)。 runner.setDaemon(真の); runner.start(); してみてください{ runner.join(); 完成 = 真; } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } }。 executeThread.start(); } 公共 ボイドシャットダウン(長いミル){ 長い CURRENTTIME = にSystem.currentTimeMillis(); しばらく(!{完成) 長い shutdownRunnedTime =にSystem.currentTimeMillis() - CURRENTTIME。 もし(shutdownRunnedTime> ミル){ System.out.println(「タスクタイムアウト、それを終了する必要があります」); executeThread.interrupt(); 休憩; } してみてください{ executeThread.sleep( 1 )。 } キャッチ(InterruptedExceptionある電子){ System.err.println( "実行スレッドが中断" ); BREAK ; } } 完成 = 偽; } }
テストコードセクション
パッケージcom.dwz.concurrency.chapter6。 パブリック クラスThreadCloseForce { 公共 静的 ボイドメイン(文字列[]引数){ 長い開始= にSystem.currentTimeMillis(); ThreadService TS = 新しいThreadService(); ts.executeは(() - > { //は非常に重いリソースをロードし ながら、(真){ } }); ts.shutdown( 10000 ); 長い端= にSystem.currentTimeMillis(); System.out.println( "実際の走行時間:" +(エンド- スタート)); } }