スレッドとのRunnableに関する注意

ここでは、簡単なマルチスレッドのアプローチは、各スレッドが一人で自分のrunメソッドを実行することができ、あります。

パッケージhello.test。


//スレッドとのRunnableの一部に
パブリッククラスのテスト{
//スレッドを作成し、一つはスレッドサブクラスであることクラスを宣言することである二つの方法があります。このサブクラスは、クラスのスレッドのrunメソッドをオーバーライドする必要があります。あなたは、割り当てられた後、サブクラスのインスタンスを起動することができます。
{PrimeThreadスレッドクラス延び
//パスが来たパラメータのいくつかを使用する必要があるかもしれない
長いminPrimeと、

PrimeThread(長いminPrime){
this.minPrime = minPrime。
}

RUN無効パブリック(){
//やって、この特定のスレッドを使用したい

}
}

//スレッドを作成し、実行を開始
ます。public voidテスト(){
PrimeThread PrimeThread新しい新しい= P(143);
p.startを();
}

//スレッドを作成するもう一つの方法は、操作インタフェースのクラスを達成宣言することです。このクラスは、runメソッドを実装します。あなたは、スレッドを作成するときにパラメータとして渡され、クラスのインスタンスを割り当て、次に起動することができます。

静的クラスPrimeRunはRunnableを{実装
;長minPrimeを

PrimeRun(長いminPrime){
this.minPrime = minPrime。
}

RUNボイドパブリック(){
(INT I = 0;私はminPrimeを<; I ++)のために{
のSystem.out.println(I);
}
}
}

//スレッドを作成し、実行を開始
)パブリック静的ボイドTEST1を({
PrimeRun P1 PrimeRun新しい新=(10)、
新しい新しいスレッド(P1).start();
}

//各スレッドは識別のための名前を持っています。複数のスレッドが同じ名前を持つことができます。スレッドを作成するときに名前が指定されていない場合、スイッチは新しい名前を生成します。特に断りのない限り、このクラスのコンストラクタまたはメソッドにnullパラメータを渡すと、NullPointerExceptionが発生します。
//マルチスレッドアプローチ書き込むために再利用することができる
公共の静的無効メイン(文字列[] args){
試み{
{(。;私は<4 I ++ INT I = 0)のための
TEST1();
}
}キャッチ(例外E){
システム.out.println(E);
}
}
}

 

どちらの方法は、自分の長所と短所を持っています:

ソースコードの違い
継承Threadクラスの方法:スタートを呼び出すとき、子クラスは、()の実行Threadクラスをオーバーライドすると()、直接run()メソッド(Java仮想マシンに自動的に)サブクラスの
構築:Runnableを道を実装関数は、Runnableをが空のときに内部メンバ変数の参照を決定するためにrun()メソッドを呼び出して、空でない場合は、コンパイル時に見て)(、Runnableを参照し、Threadクラスに渡されたメンバ変数を開始合格しましたRunnable実行()、ランタイム実行は、具体的な実装クラスの実行()である
:長所と短所
の継承スレッドクラスの道の
利点は:あなたが直接Threadクラスを使用することができ、コードは単純です
欠点:また、オブジェクト指向の継承であります短所:具象クラスは、既に他の親を持っている場合は、あなたがいない多重継承のThreadクラス、あなたがこの方法を使用することはできません。この利点指向プログラミング・インタフェースで目立ちます。
Runnableを実装方法の
欠点の継承:利益をスレッドクラスはまた、Runnableインタフェースを実装することができ、他の親の独自の定義を持っている場合でも。Javaインタフェースが達成可能であるよりも、継承は、より限定された単一継承です。
欠点:この方法は、実装クラスThreadクラスに一次転写対象にRunnableを必要、スレッドクラスに直接使用することができず、スレッドオブジェクトを得た後、スレッドクラスのメソッドを取得するために、コードが比較的複雑です

このメソッドは、戻り値は非同期で実行ExecutorServiceのに提出され、コールの戻り値を必要とし、例外をスローする可能性がある場合も、呼び出し可能なマルチスレッドがあります

公共の静的な無効メイン(文字列[]引数)はInterruptedExceptionある、ExecutionExceptionを{スロー

//スレッドプールオブジェクトを作成
(2)ExecutorServiceの= Executors.newFixedThreadPoolプール;
ここで、MyCallable試験は、静的クラスのような通常のインスタンス変数と同様内部クラスであるので、//これは、クラスのオブジェクトをインスタンス化するために、ここで必要とされます方法は、直接クラスのインスタンス変数を呼び出すことはできません。ここで、内部の内部クラスは、したがって、直接割り当て(すなわち、内部クラスのインスタンス)は、プログラムが指定され、静的クラスはありません。
=新しい新しいテストテストテスト();
//タスク提出
フューチャー<整数> = F1のpool.submitを(test.new MyCallable());
今後の<整数> = F2のpool.submit(test.new MyCallable());
整数I f1.get =()
;整数I1 =()f2.get
のSystem.out.println(I1);
//閉じるスレッドプール
pool.shutdown();
}

クラスMyCallableは呼び出し可能<整数> {実装
パブリックMyCallable(){
}を

@Override
パブリック整数コール()は、{例外をスロー

int型私= 0;
用(INT X = 0; X <100であり; x ++){
System.out.printlnは(にThread.currentThread()のgetName()+ ":" + X)。

I ++;
}
Iを返します。
}
}

 



 

 

おすすめ

転載: www.cnblogs.com/duidui-li/p/11069900.html