2016-04-20 3 views
1

NettysドキュメントによればGlobalEventExecutorは、一つのスレッドを使用してインスタンスを1つだけ有することを意味するシングルスレッドシングルトンEventExecutorNettys GlobalEventExecuterは現在のスレッドを利用していますか?

あります。新しいスレッドの中でGlobalEventExecutorを使用します。クラスは常に現在のスレッドを使用しますか、それともすべてのスレッドを使用しますか?

2番目が正しい場合、スレッドプール内でGlobalEventExecutorを使用することは意味をなさないことを意味します。代わりに私の約束のためにスレッドプールを使用しますが、GlobalEventExecutorのようにグローバルにする必要があります。

どうすればこの問題を解決できますか?

答えて

2

GlobalEventExecutorは、単一スレッドベースのイベント実行プログラムです。

このクラスは、新しいタスクがサブミットされるときに必要ならばstart a new threadになります。このスレッドは、コードを実行するスレッドと共有されません。

このグローバルインスタンスを複数のクラスから呼び出す場合でも、タスクの実行にはバックグラウンドで1つのスレッドしか使用されません。

このクラスは、しばらくの間タスクが送信されなかったことを検出すると、内部スレッドをシャットダウンし、再度必要に応じて再作成します。この時間はデフォルトで1秒です。

This can be verified by looking at the source of GlobalEventExecutor

+0

私はtheadpoolの中で私自身のtheadプールでPromisesを使うべきですか?または、GobalEventEventexecutorを使用する利点がありますか? –

+0

状況全体を再考することは、以下の考えで終わりました。約束内のGlobalEventExecutorインスタンスは、将来のイベントの発生のみに責任があります。ビジネスロジックの実際の実行とは関係ありません。私のスレッドプールの中でそれを使用することは完全に大丈夫ですか、私はここで何か間違っていますか? –

+0

独自のスレッドプールでそれを使用するのはまったく問題ありませんが、スレッドのコンテキスト切り替え量を最小限に抑えるためにイベントをスケジューリングするときは、グローバル実行プログラムの代わりにチャネルexecuter( 'ctx.exec()') – Ferrybig

関連する問題