Javaは(マルチスレッド)チュートリアルはじめに

スレッドの概念
タスクの後に、純粋な種子は、その後に行うタスクのモードを完了したので、次のタスクは前のタスクの終了を待つ必要があり、タスクが次のタスクの前に完了した後にのみ開始されます。Java言語は、開発者が、プログラム内の関数を完了するために、各スレッドを複数のスレッドを実行することを可能にする同時実行メカニズムを提供し、同時に他のスレッドを有します。このメカニズムは、マルチスレッドと呼ばれています。ユニットとしてのシステム・プロセスを動作させる、我々はWindowsの下にあります

次いで、システムCPU(また、CPUのタイムスライスと呼ばれる)によって実行される各プロセスの限られた時間に割り当てられることが可能で、CPUが処理を実行し、この時、時間の期間と他を実行するために次の処理にジャンプします。CPUの速度がユーザーにこれらのタスクを同時に実行するように見えるという感覚を与えて、すぐに切り替わるので、マルチスレッド技術を使用するので、同時にタスクの多くの異なる種類を実行することができます。

特長は、単一のタスクが実行のためにキューに入れられている彼らは、このコマンドは、次のコマンドを実行することができますが完了するまで、それはちょうどCMDでコマンドを入力した後、同期している、待たなければなりません。

CPUは大幅にシステムの効率を高めることが、2の前に5秒を待たのタスクは、実行することを、タスク1と2の間で前後に切り替えることができます。これは、スレッドがプロセスで実行している別のサブタスクとして理解することができる、マルチスレッド技術を使用することです。

実装
1は、Threadクラスを継承することであり、他方は、Runnableインタフェースを達成することです:マルチスレッドプログラミング、主に二つの方法があります

类スレッド
パブリック・スレッド(文字列のthreadName)
公共のスレッド()

Threadクラスのnewthread {公共拡張
@Override
ます。public void実行(){
//スレッドの実行コード
}
}
//使用
新しいNewThread()の開始を(); 。
サービスコードは、スレッドのrun()メソッドを達成するために設定する必要があります。クラスは、Threadクラスから継承するときは、このクラスのrun()メソッドではカバーでき、run()メソッドのマルチスレッド機能を実装するコードを記述して、同時に実行開始Threadクラス()メソッドのスレッドを呼び出し、それは、呼び出しですrun()メソッド

、Runnableインタフェースを
使用すると、クラスを作成したい場合は、スレッドがJavaは多重継承をサポートしていないので、あなたは、Threadクラスを継承することはできません、親が、このような状況に対処するRunnableを実装する必要があります

公共のスレッド(RunnableをR);
公共のスレッド(RunnableをR、文字列の名前)。

パブリッククラスMyRunnable実装が実行可能{
@Override
公共ボイドRUN(){
コード実行スレッド//
}
}
//使用
=()RunnableをRunnableを新しい新規MyRunnableと、
スレッドは、新しい新しい=スレッド(Runnableを)を通し、
Thread.start();
スレッドライフサイクル
スレッドも7つの状態の種類、すなわち出生状態、レディ状態、実行状態、待ち状態、休止状態、ブロッキング状態と死の状態を含め、ライフサイクルを持っています

ステータス生まれ:ユーザーがインスタンスのstart()メソッドを呼び出すまで、あなたがスレッドを作成するときに、ユーザーのステータスが配置され、スレッド、スレッドは状態で生まれています。

レディ状態:ユーザー・コール()メソッドを起動したときにも、実行可能な状態として知られているが、スレッドが準備完了状態にあります。

動作状態:スレッドが操作にシステムリソースを取得します。

待ち状態:スレッドが呼び出し待機Threadクラス()メソッドで実行されているとき、スレッドは待機状態になります。スレッドは待機状態に入ります

Threadクラスを通知呼び出す必要があります()メソッドを覚醒させることができます。notifyAll()メソッドは、待機状態にまったく糸を覚ますことです。

スリープ:スレッドがThreadクラスの睡眠()メソッドを呼び出すと、それはスリープ状態になります。

閉塞状態:スレッドが動作状態で入力/出力要求を発行した場合、スレッドは、ブロックされた状態になり、それが準備完了状態に、入力/出力端のためのスレッドを待機します。ブロックされたスレッド上で、システムリソースがオフになっている場合でも、スレッドがまだ実行に戻ることはできません。

死の状態:終了実行スレッド()メソッド、死の状態にスレッド。

同期同期メカニズム
この競争に対処するためのリソースを共有するためには、あなたが同期メカニズムを使用することができます。同時にオブジェクトに作用する二つのスレッドを参照する、いわゆる同期メカニズムは、オブジェクトは、データの統一性と整合性を維持する必要があります。Javaは、synchronizedキーワードを提供し、リソースの競合を防ぐためのビルトインサポートを提供します。

同期メソッドの
クラスclassName {
パブリック同期型methodNameの(){
//コード
}
}
シンクブロック
同期(OBJ){
//コード
}
パブリッククラスTest {
オブジェクトOBJ =新しい新しいオブジェクト();
公共ボイドメソッド(){
同期(OBJ) {
//コード
}
}
}
マルチスレッドおよび他のトラフィックのための本質的に異なる、マルチスレッド処理を使用して、非常に複雑な操作を処理するとき、のみ同期コード・ブロックが実行される順番の同期シングルスレッド各コードは、別のスレッドで実行されます。

curentThread()が
どのスレッドと呼ばれているコード・セグメントについてのスレッド情報を返し

静的な無効メインパブリック(文字列[]引数)
{
を出力する//呼び出しcurrentThread()メソッドは、現在のスレッドの名前
のSystem.out.println(にThread.currentThread()のgetName());
}
publicクラスMyThreadスレッド{延び
@Override
公共ボイドRUN(){
System.out.printlnは(にThread.currentThread()のgetName());
}
}
myThread myThreadは、(= myThread新しい新規);
スレッド新しい新しいTスレッド(myThreadを)=;
t.setName( "myThread");
T .start(); //出力myThread;
のisAlive()
アクションのisAlive()メソッドは、現在のスレッドがアクティブであるかどうかを決定することです。それがアクティブな何ですか?アクティブなスレッドが開始され、終了していないです。状態が実行されているスレッドまたは実行する準備ができて、私は、スレッドは、「サバイバル」だと思います

MyThread公共Threadクラスを拡張
{
@Override
公共ボイドRUN()
{
;のSystem.out.println( "RUN =" + this.isAlive())
}
}
パブリック静的無効メイン(文字列[] args)
{
MyThread =新しい新しいMyThread MyThread ();
System.out.printlnは( "開始=" + mythread.isAlive()); //出力スレッド状態
mythread.start(); //スレッドを起動
するSystem.out.println( "端=" + mythread.isAliveを()); //出力スレッド状態
}
//出力が
始まります
終了
trueまたはfalse //ここでは、スレッドが開始した後(この場合には終わりがトゥーレある)スレッドが開始される前に、実行することも可能である(この場合にはfalseに終わる)が行うことが可能であるエンド、コードを実行するスレッドを起動するために、他のことに注意しなければならない
実行を真=に
スリープ()
睡眠の役割()メソッドは、指定されたミリ秒数内に現在の「実行中のスレッド」睡眠をさせることである(中断)

MyThreadは、公共Threadクラスを拡張
{
@Override
公共ボイドRUN()
{
; System.out.printlnは( "スタート")
のThread.sleep(2000); 2秒//の遅延
するSystem.out.println( "終了");
}
}
のgetId()
のgetId()は、実行中のスレッド固有の識別を行いました

スレッド=スレッドにThread.currentThread();
のSystem.out.println(thread.getId());
スレッド休止
ポーズスレッドは、このスレッドが動作を再開することができることを意味します。スレッドを一時停止する一時停止()メソッドを使用して、利用履歴書()メソッドは、実行スレッドを再開します

パブリッククラスMyThreadは、Thread拡張
{
プライベート長いI = 0;
公衆ロングGETI()
{
Iを返します。
}
公共ボイドSETI(長いI)
{
this.i = I。
}
@Override
公共ボイドラン()
{
一方(TRUE)
{
I ++。
}
}
}
パブリック静的無効メイン(文字列[] args){
MyThreadスレッド=新しいMyThread()。
thread.start();
System.out.println(「线程开始」);
System.out.println(のSystem.currentTimeMillis()+」i =「+ thread.getI()); //输出I的值
ないThread.suspend(); //暂停
するSystem.out.println(「は线程暂停5秒「);
のThread.sleep(5000);
Thread.resumeが(); //开始
System.out.println(のSystem.currentTimeMillis()+ "I =" + thread.getI()); //は、iの値は、停止されたまま
}
注:使用する場合、()メソッドを再開する一時停止()メソッドを使用する場合不適切な同期オブジェクトを簡単に他のスレッドが共通の同期オブジェクトにアクセスできないように国民が、排他的である引き起こす可能性があります。使用時には特に注意を払う必要があります。

スレッドの停止
スレッドを停止するには、スレッドが現在の操作を放棄することであるタスクを、実行を停止する前に操作が処理されていることを意味します。スレッドを停止するには、3つの方法があります。

通常、それが終了するスレッドを完了するために、run()メソッドであるスレッドが終了、終了識別を使用。
stop()メソッドを使用して強制的にスレッドを終了が、この方法が推奨されていない、(停止するので)と(一時停止)と()を再開し、方法は期限切れの無効である、それらの使用は、予期しない結果が生じることがあります。
割り込み()メソッド割り込みスレッドを使用してください。
割り込み()
アクション割り込み()メソッドは、メソッドの効果を使用して)(スレッドを停止するために使用されるが、intermptされた上記ループ構造break文として、サイクルを直ちに停止させることができません。intermpt()メソッドの呼び出しは、現在のスレッドにタグを再生するだけで、停止され、スレッドが実際に停止されていません

パブリッククラスMyThreadはスレッド延び
{
@Override
公共ボイドラン()
{
(; iが10000 <I ++は、I = 0の整数)のための
{
System.out.printlnは(I + 1)。
}
}
}

静的な無効メインパブリック(文字列[]引数){
MyThread MyThread新しい新しいスレッド=(); //スレッドクラスインスタンスMyThread13の作成
thread.startを(); //スレッド開始
のThread.sleep(100); 100ミリ秒の//遅延
スレッド.INTERRUPT(); //停止スレッド
}
実行結果をメインスレッドの下に示されています。図から分かるように、100ミリ秒()メソッドの遅延後にコールintermptは、スレッドのスレッドを停止するが、そのスレッドは、依然として完全な出力に情報の10000行が実行されません。

裁判官スレッドは停止されません
)(this.interrupted:現在のスレッドが割り込まれているかどうかをテストします。
this.islnterrupted():このスレッドが中断されたかどうかをテストします。
)(停止
方法は、いずれの場合も、スレッドを停止するように強制することができる)(停止するために呼び出します

MyThreadスレッドクラスを拡張{パブリック
プライベートint型I = 0;
@Override
公共ボイドRUN(){
(真の)一方{
I ++は、
のSystem.out.printlnを( "I =" + I)
のThread.sleep(1000);
}
}
}
MyThread MyThread新しい新しいスレッド=();
Thread.start();
のThread.sleep(8000);
Thread.stopの();
スレッドがこの期間意志サイクル9の間に、開始後8000ミリ秒の遅延を有します、スレッドが停止するように停止した後()メソッドが実行されます。出力1-9を実行した後

あなたがstop()メソッドを呼び出したときからjava.lang.ThreadDeathは例外をスローしますが、通常の状況下では、この例外を明示的にキャプチャする必要はありません。データの矛盾に結果を引き起こしますロックを解除するには、stop()を使用してください。この問題が発生した場合は、データ処理プログラム、誤ったプログラムの実行プロセスにつながる、そこに破損する可能性があり、我々は特別な注意を払う必要があります。

深センの建設現場https://www.sz886.com

おすすめ

転載: blog.csdn.net/chenmh12/article/details/91411370