whimsyが代替パイプラインモードを達成-java


百ノック

同社は、タスクチェーンのためのようなものを書き込みコードへの前任者を確認するためのプロジェクトを行っています

Runnable task = new TaskA(new TaskB(new TaskC(new taskD())));
task.run();

最後のものは、膣分泌なくなるまでtaskA実行ラン呼び出し後TaskAが自動的に実行メソッドTaskB渡されたコンストラクタパラメータをコールする内部宣言タスクロジックを完了し、プロセスは類似TaskAある、TaskBは、コールパラメータの完了後、受信タスクと同じになりますタスクが完了したタスクの着信クラスと呼ばれるパイプラインの完成。

私が考えていたと考えるのが大好きですが、変更の手に変え、その後、使用使用することは困難再利用することができます。


レディ

一定の期間迅速な開発のための一般的に使用されるツールで、開発が、ここでの何かがほとんど使用されない、または説明するためにした後、ここで私はもちろんのecommonというパッケージを使用し、私は2つだけを持っていました量の非常に基本的な部分。二つの部分は、独自の実装は非常に簡単です使用することができます。

  • ファンクションインタフェース

    jdk8後簡単にパラメータや戻り値の種類の数に応じて、その後、自身が12のインターフェースを書き直し、私たちはラムダを書くが、私はそれを理解することは直感的ではありません考えてみましょう直接関数名に基づいて選出するご案内することができます。具体的にhttps://github.com/kimffy24/EJoker/tree/dev/ejoker-common/src/main/java/pro/jiefzz/ejoker/common/system/functional、IVoidに始まるが戻されていません数は、パラメータや戻り値の型は、すべての一般的なもので、取るべきパラメータの数です。1-6のパラメータは、大多数の症例を含めることができました、状況はより多くのパラメータが過去にコンテキスト転送をカスタマイズすることができます必要があります。

  • ぬいぐるみの文字列

    同様にString.format、私は定期を持っていないが、同様の種類をSLF4J log.info("This is a template, keyA={}, keyB={}", "valueA", "valueB")ように、このプレースホルダの塗りつぶしとして、。私はこの方法https://github.com/kimffy24/EJoker/blob/dev/ejoker-common/src/main/java/pro/jiefzz/ejoker/common/system/helper/StringHelper.javaで塗りつぶしを実現しました。また、使用することができますString.format代わりに。

簡単なアイデア

レッツ明確な、jdk8次の場合は考慮されません。

パイプラインの私の印象では、端末からのより多くのアプリケーションであります

コマンドは、端末ダクトに使用されます

パイプラインには、次のタスクが存在しなくなるまで、最後の一つは、あなたが期待するタスクの役割であるべきタスクの入力として次のタスク一方向の出力です。そして、后续任务只关心前者的输出结果,对于的他是谁,怎么做的,是不关心的表記Point1

この機能は、私は、パイプカットまたはデューティチェーンの嘘との違いと見なさものです。

まず、我々はそのパイプラインの流れが先頭を持っているので、その中間のタスクがあり、最初のプッシュを持っている必要があり、彼はタスクの出力を受け取ることができなければならない、と内蔵のパラメータを持っており、自分の出力を有していてもよく、最後に、中間のタスクとタスクの違いがあり、彼は、通常、私たちの試みの副作用最新の実現の形で、上の図を最新のリターンを持っていないということであるwc -l最後のタスクではなく、変数を返すので、画面に印刷された結果を向けることであるとして、私たちにお読みください。Javaが強くプロパティを入力し、ちょうどいくつかの分析を、知ることができる、3つのタスクの種類、タスクの開始、中間タスク、最後のタスクがあり、そしてタスクは、隣接するすべてのタスクのように、中間の数に限定されるものではなく、そのタスクは、関連するポイントを持っている前者的输出类型与后者的输入类型一致ほとんどの(ネットワークパターンのパイプラインのテキストはすべてのサブタスクがタイプへの強いニーズを所有する彼らの実現が良いか悪いかを言っていない、オブジェクトタイプ渡されると言うが、私は確信しています私は)好きではありません。この機能は呼ばれていますPoint2

また、各サブタスク自体は、ポイントをサポートするために必要なパラメータを取ることができます。パイプ上の図のコマンド画像、各サブコマンドコマンドが入力として受け入れられる前に、同時に出力(最初を除く)、およびパラメータが来ます。しかし、Javaは、ここで実際に柔軟ではないので、我々は、合意された后续任务的第一个参数就是前一个任务的输入この大会は、我々のコードの実装に直接的な影響であること。この機能は呼ばれていますPoint3

さらに、唯一の入口ダクトは、タスクがバックストリームから開始する必要があります。エントリが同じでない場合、それは、異なるパイプラインのようなものです彼らの意図や目的の入力と出力が異なっています。この機能は呼ばれていますPoint4

最後に、Javaで、私は確かにそのように終了することはできません、間違ったコマンド重いが、このような印刷の日、アサーションとして、何かをする隣接するタスクネクサスのいくつかの瞬間を異常に制御して行う必要があるので、それは、望んでノック。追加の質問を数えます。

キーボードのラインを持ち上げて、

(私は書かれており、オーバーテストしてきたように、私は私の決意を回してまで考える方法です)

ここではインタフェースのための基礎として、Runnableインタフェースで。試験についての実施例

ここでの最初のタスクは、タスクが中産階級に優しい大人1名文をスプライスすることで、最後のタスクは、画面に直接印刷することで、日付を与えることです。、パイプラインの初期タスクの定義を見て(実際にはもちろん、ダイレクトラインや友人がちょうどデモのために、ここでは、そのようなAの単語を達成するために)

コンストラクタ、パスを参照、他のプロパティを見てはいけないIFunction<R>、定義に従って準備を、彼は戻り値の型は、一般的な文のRではありませんし、何の閉鎖機能の入力パラメータ(またはラムダ式と呼ばれます)。PipelineTestは上記の制御ということである() -> { return new Date(); }、(jdk8感謝して推論を入力するnew Pipeline<>一般的な文を持たない、構築、コンパイラはここで閉鎖機能は、Date型である戻り値の型を推論することができます)。nextendパイプラインで見ることができるパイプラインの次のタスクに指定されていることは非常に責任のタスクチェーン/チェーンに似(に注意を払う必要があることであるnextend同時に只能有个一个存在)。フックメソッドは、(これが原因でJavaを必要とされ、パイプラインモードとは関係ありません)使いやすい、argCxtは、パラメータを渡すのノートで、着手する方法のフックをタスクと例外管理の間の時間の一部を行うことです。

ヘビーデューティーの方法の外観を追加し、戻りは中間タスクを追加します

渡す方法を追加IFunction1<RT, R>クロージャ(ラムダ)を、仮数が1である、受付手段Rの入力のタイプ、および文Lの方法RTには、RT出力としてタイプ。前記Rの方法でクラス構造上の一般的な宣言Rと同じタイプです。RT推論の特定のタイプは、特定のラムダの戻り型によって決定されるであろう。ここでは追加メソッドが返すだけの作業の途中で構築されたオブジェクトを宣言します。現在のタスクは、後継タスク宣言されないことを確実にする方法の必要性を追加します。

ルッククラスはMiddlePipelineを定義し

彼が入ってくるaddメソッドクロージャを受け入れることで、施工方法を見てください。彼は2つの変数が一般的なもので宣言し<C, P>た、C彼の入力タイプを表し、P彼は、出力の種類を表します。最初のタスクと同じように、彼が持っているnextend彼のパイプを示した後、次のタスク(next)。それは、ここでの注目することができるnextの財産と初期タスクnextジェネリックのワイルドカードの上に置かれている出力タイプの?タスクは、彼のサブタスク(バックはあなたにこの質問を教えてくれます)の出力の種類を知る方法はありませんので、。

この方法でさらに見て、最終追加タスクとリターンを追加し、過負荷

しかし、閉鎖のノーリターンで、中間状態と同様のタスクをバック。

ルッククラス定義されEndPipeline

新鮮な多くのの定義の最後のタスクは、彼が唯一の入力を気にして実行します。そして、彼は休みをしました。

分析補足はAbstractPipeline下に来ます

この文言は、達成することであるPoint4すべての入り口初期タスクのものと同じパイプラインでの作業にその限り、問題で説明したrun方法。(簡単後続タスク基底クラスと派生クラスを達成するためにあるすべての非静的初期作業内部クラス)

初版のバージョンで実行する方法を見てください

ロジックは簡単であり、初期タスクの結果は、その後のタスクを見つけ得る、中間状態まで(次の入力サイクルと上記出力満たす)の導管クラスを強制後続のタスクを実行するための入力として結果null、最後の作業は、かどうかを決定することであるnull非空それを実行します。

これは、使用ここで注意しなければならない@SuppressWarningsと確信Javaコンパイラは、2つの連続したアドオンの着信タスクの入力と出力の間の関係のタイプは、(これは、いない場合は、コードを書く時にエラーがスローされますと同じであることを保証するためにあるため、警告を抑制するためにIDE A)。

これは、基本的なパイプラインモードの簡単なJava実装を使用することができ、非常にdemoTestは問題ありませんことを始めて実行します。

サンプルのデモを与えます

彼の名前が示唆すると同じように、パイプラインの責任の三つの方法(私はこれは単純な新しい外観で実現)、文字列を一緒にパイプラインとそのaddメソッドの上に、同じクラス、赤一部として結果。スマートの人々は確かにそれほどのjavaの流れのようなと思いますか?エンドポイントとして定義されているようなああ、個々の要素へのストリームが上に行くに似ている、と彼は論理的に一貫性のあるが、もちろん、問題は別の複雑であるため、これは、並列に便利なスイッチへの消費者のためのコードは、その理由をストリームである(行ってきましたレベルの問題)。

あなたが従事する方法のスループットを増やしたい場合はパイプラインは、横方向の段階を実行する段階でありますか?ワイズあなたは確かに断片化を考えると、すべての道はただparallelstreamの意図と一致するたまたま行くことができます。そして、それの他の利点があるのですか?ああ、あなたは模擬テストはないでしょうか?(ここではコマンドとしてメソッド名ように)より良いセグメンテーションを作るために、あなたには何の責任もありませんか?


さらなる改善

1は基本的にでき上にPoint1Point2半分はPoint3Point4実装、および残りPoint2、それのタスクを受信する前に入力に加えて、来るパイプラインを宣言することができたときには、Javaになると、この機能はまた別の問題としてだけでなく、パラメータを渡しますアプリケーション上の妥協。

パラメータ文は、パイプラインの上に来ます

今回はうまく利用する必要がある准备のもの1の函数接口それが良好な解像度ではないと言うが、あなたはあまりにもカリーカレーの概念を理解していれば、あなたは図、図ということを理解しています。

ラムダは、ラムダ式のパラメータなしで初めての引数を再パッケージすることです。背中部分のパラメータは、単一の引数を取り、似ているラムダ式の同じ型を返すmiddlePipelineの再シールです。

試験は、説明上の画像と一緒に、かどうかを確認します

Javaのためのフレンドリーなサポート

追加の質問は、ちょうどそれが望んでいる彼らの対応する箇所の実装では、それぞれ2つのガジェットを設定するための場所を見つけ、この単純なことを言います

public class PipelineHook {
    
    private boolean preventThrow = false;

    // 异常发生时执行此表达式
    public final IVoidFunction3<PipelineHook, Exception, Object[]> exceptionHandler;
    
    // 调用后续任务钱执行此lambda表达式
    public final IVoidFunction1<Object> aspecter;

    public PipelineHook(IVoidFunction3<PipelineHook, Exception, Object[]> exceptionHandler, IVoidFunction1<Object> aspecter) {
        this.exceptionHandler = exceptionHandler;
        this.aspecter = aspecter;
    }

    public PipelineHook(IVoidFunction1<Object> aspecter) {
        this(null, aspecter);
    }

    public PipelineHook(IVoidFunction3<PipelineHook, Exception, Object[]> exceptionHandler) {
        this(exceptionHandler, null);
    }

    // 是否阻止异常抛出
    public boolean isPreventThrow() {
        return preventThrow;
    }

    // 设置标记阻止异常抛出
    public void setPreventThrow() {
        this.preventThrow = true;
    }
    
}

2つのフックラムダターゲット変数で構成されており、最初のタスクがされaddPipelineHook、それらの特定には、メソッドに設定runRUNを更新するための方法として、今メソッド本体が役割を果たし、

どちらのgetCxtInfo方法で文字列なので、その情報が異常な人を読むことができるサブタスクに現在のパラメータを保存します。


まずここでは、今日、ダウン全体的に、私はあまり流れと同じように、私はええ、それは特に、ストリームコードを冷やすた悲惨な特殊な読み(特にマルチストリームは、他の人の時間を読んで)、このパイプラインは逆に感じます。一般的に、パターンは、スループット改善する必要がある、スレッドプールで使用するスライスは、その後、スループット(当社parallelStreamそれを?ハハ、各割り当てのサイズが1に設定されていない)ああ、大規模なアップグレードになります。

問題在:https://github.com/kimffy24/EJoker/issues/30

初期投稿:https://github.com/kimffy24/EJoker/commit/c71e5d76a0904249b7c1399bd8ba52ec72fe9a0e

おすすめ

転載: www.cnblogs.com/jiefzz/p/12543896.html