スレッドを作成するための4つの方法があります。
1、継承Threadクラス(真の意味でのスレッドのクラス)は、Runnableインタフェースを達成することです。
2、Runnableを実装し、かつそのrunメソッドをオーバーライドします。
図3は、エグゼキュータフレームワークを使用してスレッドプールを作成します。エグゼキュータのフレームワークは、スレッドプールで提供jucを達成することです。
4、呼び出し可能なインターフェイスを達成するために、コールオーバーライドメソッド
呼び出し元のスレッドのstart():スレッドを開始し、(適切な実行を呼び出す)する方法
ThreadクラスのThreadクラスから継承されます、あなたは直接スレッドを開始するために、startメソッドを呼び出すことができます(静的を使用してもリソースを共有することができます)。スレッド(オブジェクト)のみ()を起動し、一度に行うことができ、(オブジェクトを実装Threadクラスを実行することはできません)へスレッドを開始します。
startメソッドは、Runnableインタフェースクラスを実装するために呼び出された後、再度、Threadクラスのパッケージを使用する必要があります。(三のThreadオブジェクトラッパークラスのオブジェクトは、リソースの共有を実現します)。
そして、ロックの使用に注意を払うとスレッドを使用して同期。(がちな共有リソースのセキュリティスレッドへのマルチスレッドアクセス)
一般的に、一般的には秒です。
*、Runnableインタフェースは、次のような利点があります。
継承の制限を回避するため*①点、クラスは複数のインタフェースを継承することができます。
*②リソースの共有に適し
1、継承のスレッド
// サブクラスを作成しますが、スレッドの継承 クラス DemoThreadが拡張スレッド{ 公共 空RUN(){ // RUN 2. Threadクラスの書き換え可能()メソッドを、子スレッドの機能を実現するための方法を完了する ために(int型 I 1 =; I ++; Iは= 10 < ){ System.out.printlnは(にThread.currentThread()のgetName() + ":" + I); } } } パブリック クラスTestThread { 公共 静的 ボイドメイン(文字列[]引数を){ // オブジェクトのサブクラスを作成 DemoThreadを= S 新しい新しいDemoThread(); //4.呼び出し元のスレッド開始():このスレッドが開始され、適切なrun()メソッドの呼び出し s.startを(); // メインスレッドには、以下の続く ために(int型 ;;私は10 = <I ++はI = 1。{) システム。 out.printlnを(I); } } }
/ * スレッドの一般的な方法: * 1.startは():スレッドを起動し、対応するrun()メソッドを実行 * 2.run():サブスレッドはrun()メソッド内のコードを実行する * 3.currentThread() :現在のスレッドの呼び出し、静的 このスレッドの名前を取得します:()*の4.getNameを )(*の5.setNameを:このスレッドの名前を設定 )(*の6.yieldを:このメソッドは右のCPUを解放するために、現在実行中のスレッドと呼ばれています * 7.join():呼び出し元のスレッドがを続行する前に完了するために、次のスレッドの後に実行するために待っている * 8.isAliveは():現在のスレッドがまだ生きているかどうかを判断 明示的にスリープ状態に現在のスレッドを許可する:* 9.sleep(長い1) 1ミリ秒 * 10スレッド通信:待機()(通知)のnotifyAll() * *設定スレッドの優先順位 * getPriorityは():スレッドの優先順位値を返し 、スレッドの優先順位を変更する:* setPriorityを(INT newPriority) * * /
マルチスレッドの小さなデモ:
/ * 2つのサブスレッドを作成しているので、1〜100の間に偶数前記出力、1-100の間の奇数の別の出力* / クラススレッド1 延びスレッド{ 公共 ボイドRUN(){ 用(INT I = 1; I <= 100; I ++は){ IF(I%2 == 0 ) のSystem.out.println(にThread.currentThread()のgetName() + ":" + I); } } } クラススレッド2 延びスレッド{ 公共 ボイドRUN (){ 用(INT I = 1; I 100 = <; I ++は){ IF(I = 2%0!) System.out.println(にThread.currentThread()のgetName()。 + ":" + I)。 } } } パブリック クラスTestThread { 公共 静的 ボイドメイン(文字列[]引数){ スレッド1、S1 = 新しいスレッド1()。 スレッド2 S2 = 新しいスレッド2(); s1.start(); s2.start(); // 继承于スレッド类的匿名类的对象 // 新しいスレッド(){ // ます。public void実行(){ // ための(int型I = 1;私は= 100 <;私は++){ // もし(I%2 == 0) // するSystem.out.println(。にThread.currentThread()のgetName()+ ":" + I)。 // } // } // } .start(); // // 新しいスレッド(){ // ます。public void実行(){ // ための(int型I = 1;私は= 100 <;私は++){ // もし(!I%2 = 0) // のSystem.out .println(にThread.currentThread()のgetName()+ ":" + I)。 // } // } // } .start(); } }
2、の方法によりRunnableを実装
/ * 、偶数間1-100二つのサブスレッドを作成する* / クラスはスレッド1 を実装したRunnable { 公共 ボイドRUN(){ 用(INT I = 1; I ++は、私は= 100 < ){ IF(I%2 ==を0 ) のSystem.out.println(にThread.currentThread()のgetName() + ":" + I); } } } パブリック クラスTestThread { 公共 静的 ボイドメイン(文字列[]引数){ スレッド1 S = 新しい新しいスレッド1() ; // スレッドを起動するには、()の開始を呼び出す必要があります スレッドT1 = 新しいスレッド(S) t1.start(); スレッドT2 = 新しいスレッド(S) t2.start(); } }