1

スレッドを扱うコードの一部があり、その機能を詳細に理解したいと考えています。このrun例ではメソッドは空ですが、グローバル変数に対して実行する操作がいくつかあると仮定します。

import java.io.File;

public class DigestThread extends Thread {
   private File input;

   public DigestThread(File input) {
      this.input = input;
   }

   public void run() {
   }

   public static void main(String[] args) {
      for (int i = 0; i < args.length; i++) {
         File f = new File(args[i]);
         Thread t = new DigestThread(f);
         t.start();
      }
   }
}

スレッドを作成して開始した後、別のスレッドを作成/実行する前に run メソッドでタスクが完了するのを待ちますか?

2番目の質問

変数がrunメソッドで宣言されている場合、作成されたすべてのスレッドがメソッドでタスクを実行するため、何度も宣言されることを意味しrunます。各スレッドの変数は同じですが、すべてのスレッドは独自の変数を処理しますか?

4

4 に答える 4

5

run メソッドのタスクが完了するのを待って、別のメソッドを作成しますか?

いいえ、それが の要点ですMultithreading。すべてのスレッドには、独自の実行スタックがあります。したがって、スレッドを開始すると、スレッドはrun()メソッドに入り、別のスタックで実行され、同時にmainスレッドは独自のスタックで実行を継続します。

その後、mainスレッドは別のスレッドを生成できます。したがって、すべてのスレッドが同時に実行されますが、もちろん一度に 1 つずつ実行され、使用されている特定の CPU 割り当てアルゴリズムに基づいて、それらの間で CPU が共有されます。

マルチスレッドの実行過程については、ここではすべてを書ききることはできません。の概念に関して、いくつかのチュートリアルを読むか、いくつかのオンライン リソースを検索することをお勧めしますMultithreading。概念が明確になったら、 の実装に進みJavaます。

ここにいくつかのチュートリアルのリンクがあります: -

于 2013-01-18T20:42:37.110 に答える
2

スレッドを開始すると、別のスレッドで実行され、main() スレッドが続行されます (子スレッドが終了する前に終了する場合があります)。

メインの前にスレッドを終了させたい場合は、スレッドでThread.joinメソッドを使用してそれを待つことができます。

于 2013-01-18T20:42:26.670 に答える
2

まず、スレッドはプログラム内の単一の連続した制御フローです。プログラムで複数のスレッドを実行できますが、スレッドがどのように機能するかを知ることができるライフサイクルがあります...ここに画像の説明を入力

start()Thread のメソッドを呼び出すたびに、オーバーライドされたメソッドが自動的に呼び出され、メソッドpublic void run()のコードが実行されますrun()...

ABC および XYZ スレッド クラスを使用した Java の Thread の簡単な例を次に示します。

/* Write a program to print having two Thread Class 1) ABC with 1 second  2) XYZ 2 second. 10 times with Extend Constructor */
class ABCThreadConstructor extends Thread {
    ABCThreadConstructor(String name) {
        super(name);
    }
    public void run() {
        try {
            for(int i = 0; i < 10; i++) {
                System.out.println("ABC");
                Thread.sleep(1000);
            }
        } catch(InterruptedException ie) {
            System.out.println("Interrupted Exception : "+ie);
        }
    }
}

class XYZThreadConstructor extends Thread {
    XYZThreadConstructor(String name) {
        super(name);
    }
    public void run() {
        try{
            for(int i = 0; i < 10; i++) {
                System.out.println("XYZ");
                Thread.sleep(2000);
            }
        } catch(InterruptedException ie) {
            System.out.println("Interrupted Exception : "+ie);
        }
    }
}

class AbcXyzThreadConstructorDemo {
    public static void main(String args[]) {
        ABCThreadConstructor atc = new ABCThreadConstructor("ABCThreadConstructor");
        System.out.println("Thread Name : " + atc.getName());
        atc.start();
        XYZThreadConstructor xtc = new XYZThreadConstructor("XYZThreadConstructor");
        System.out.println("Thread Name : " + xtc.getName());
        xtc.start();
    }
}
于 2014-02-09T13:19:16.463 に答える
1

あなたの質問が「スレッドを作成して開始した後、プログラムはスレッドが run メソッドを終了するのを待ってから別のスレッドを作成しますか?」

その場合、いいえ、プログラムは待機しません。t.start()スレッドを開始し、独自のメモリ チャンクと実行するスレッド優先度を取得します。それはその操作を行い、それに応じて存在します。メイン スレッドは、args終了する前に、で指定された数のスレッドを開始します。

アプリケーションをスレッドで待機させる必要がある場合は、t.join(). そうすれば、親スレッド ( を実行するスレッドmain) は子スレッドに結合され、その操作が完了するまでブロックされます。この場合、スレッド化の目的を無効にしますが、必要なロジックのスレッド ID を保存し、後で join() することができます。

于 2013-01-18T20:43:22.257 に答える