3

私が使用している私のコードで

Thread.currentThread().sleep(sleepTime);

コードのメイン (非 Thread オブジェクト) 部分。

うまく機能しているように見えますが、後でお尻に噛み付くような落とし穴が隠れているのではないかと心配しています。

メインプロセスをしばらく放置するより良い方法はありますか? またはこれは所定の方法論ですか?

編集:

なぜこんなことをするのかと言うと…

HTTP または FTP 経由でリモート ホストに接続して処理を行うプロセスがあります。

言い換えると...

もの...

リモートに接続...

リモート接続で何かをする...

接続を閉じます...

より多くのもの...

必要に応じて繰り返します。

非常にまれなケースですが、接続がララランドになることがわかりました。失敗せず、例外もスローせず、ただ消えます。また、ブロックしているため、タイマーをインラインで設定する方法はありません。

だから、私の解決策はこれを行うことです...

もの...

接続を含む新しいスレッドを開始します...

(生成されたスレッドではなく)MAINプロセスでタイマーを使用して無限ループに入り、どちらかを待ちます

a)タスクを完了し、フラグを「完了」に設定する接続スレッド

また

b) あらかじめ設定された時間だけ待機し、接続スレッドが終了したことを報告していない場合は、スレッドを強制終了して次に進みます。

しばらくスリープし、目を覚まし、MAX_WAIT_TIME が期限切れになっているかどうかを確認するのは、メイン プロセスです。そうでない場合は、スリープに戻り、もう少し待ちます。

標準のwhileループに座っているよりも(プロセッサ上で)はるかに効率的であるように見えます。これは、必要なことを行う接続スレッドのビジネスに実際に干渉するためです。

私の質問は本当に... このアプローチについて安全でないものはありますか。私がやっていることを考えると、そうではないようです。おそらく、より標準化されたアプローチがあるかどうかを尋ねる必要がありましたか?

4

8 に答える 8

13

どんなアプリケーションを書いていますか?これはめったに良い考えではなく、クライアントGUIを作成している場合は特に悪い考えです。スレッドがスリープしている間は、応答しません。

一時停止する必要がある理由と作成しているアプリケーションの種類をより詳しく示すことができれば、それは役に立ちます。

もう1つ-あなたの呼び出しは本当にあるべきです:

Thread.sleep(sleepTime);

経由で呼び出すと、インスタンスメソッドのようcurrentThread()見えますが、そうではありません。通常の静的メソッドです。他のスレッドをスリープ状態にすることはできません。

IDEに、参照を介して静的メソッドを呼び出すオプションがあるかどうかを確認する必要があります。これにより、誤解を招くコード(このような)が発生します。

于 2009-03-12T21:05:46.777 に答える
4

落とし穴はありません。あなたがそれを言う限り、それは眠ります。

アプリケーションが長時間スリープ状態になるという考えには、落とし穴がある場合とない場合があります。

于 2009-03-12T21:05:12.863 に答える
3

危険ではありませんが、99% 以上の場合、必要だと思っても実際には必要ありません。あなたは何をしようとしているのですか?

于 2009-03-12T21:03:09.903 に答える
3

Thread.sleep は静的メソッドなので、非常に誤解を招きます。また、シャットダウンするアクションが必要な場合に備えて、きれいに目覚めることはできません(中断することはできますが、それがきれいであることに異議を唱えます)。

于 2009-03-12T21:05:12.880 に答える
2

Thread.sleepを使用する場合は、InterruptedException を適切に処理するようにしてください。

于 2009-03-12T21:34:29.720 に答える
0

接続が「なくなる」とはどういう意味ですか?タイマーを設定するインラインの方法はありませんが、必要に応じて接続タイムアウトと読み取りタイムアウトを設定できます。

タイムアウト(ミリ秒単位)を設定できるように、引数なしのコンストラクターであるconnect(SocketAddress、int)呼び出しを使用してソケットを作成します。その間に接続を確立できない場合は、例外がスローされます。

また、接続する前にsetSoTimeout()を呼び出すと、read()の呼び出しが永久にではなく、指定した時間だけブロックされるようになります。指定した時間内にデータを読み取れない場合は、例外がスローされます。

于 2009-03-12T22:01:56.987 に答える
0

タイマーを使用して遅延イベントを実行することがよくありますが、私は ScheduleExecutorService を好みます。すべてのタイムアウト アクションに同じスレッド プールを使用できます。(サイズ 1 のスレッドプールを持つことができます)

于 2009-03-14T13:47:41.347 に答える
0

AFAIRはThread.sleep()CPU 時間を浪費しませんが、無駄にObject.wait(long timeout)しません。したがって、代わりに常に使用する必要がありますObject.wait(long timeout)。私の論文を裏付ける映像は見つかりませんが、Object.wait(long timeout)通話に切り替えるとパフォーマンスが大幅に向上したと思います。

于 2009-03-14T12:46:37.813 に答える