30秒後に実行中のスレッドを魔法のように停止させることはできません。あなたがする必要があるのは、時間が経過した後、そのスレッドにいくつかの状態をチェックさせることです。時間がかかりすぎてreturn
、実行メソッドから取得されていることに注意してください。
これを行うには、おおよそ2つのアプローチがあります。
- ライブラリ呼び出しスレッドに、それぞれに少し時間がかかる「チャンク」で操作を実行させ、各チャンク間のステータスを確認します。たとえば、数十万のレコードを処理している場合、1つのバッチで数百を処理してから、フラグを確認できます。または、タイムアウトを使用してブロックする可能性のある通話を行う場合は、タイムアウトを500ミリ秒に設定し、各通話間のフラグを確認します。
- 時間切れになったときにメインスレッドにライブラリ呼び出しスレッドを中断させ、ライブラリスレッドが割り込みを正しく処理し、その場合はフラグをチェックするようにします。これには、ライブラリ呼び出しスレッドが割り込み可能なメソッドを実行する必要がありますが、実行時間が長くなる可能性のあるメソッドは割り込みを許可する必要があります。
どちらの場合も、スレッドの1つ(おそらく他に何もすることがないのでメインスレッド)にtrue
、時間が経過したら「停止」フラグを設定する必要があります(この変数は揮発性であると宣言する必要があるため、更新はすべてのスレッドで表示されます)。同様に、ライブラリ呼び出しスレッドがこのフラグをtrueと見なした場合、通常はrun()メソッドから戻ることにより、実行中の処理を停止する必要があります。
メインスレッドからライブラリスレッドを実際に強制終了するべきではありません。Thread.stop、Thread.suspend、およびThread.resumeが非推奨になっている理由、および上記で説明したものと非常によく似た代替案を参照してください。:-)