1

だから私はスレッドについて少し調べようとしています、そしてどこでもそれはすべてのプロセスが少なくとも1つのスレッドを持っていると言っています。つまり、メインクラスしかない場合はスレッドになりますね。

しかし:Threadを拡張することでクラスがスレッドになると思いました。では、メインで拡張しないのに、どうしてすべてのプロセスにスレッドがあるのでしょうか。

複数のスレッドがあると、同時に使用できるさまざまなリソースを使用する場合にのみプロセスが高速になります...たとえば、ユーザーからの入力を読み込んだ場合、1つのスレッドはユーザーが入力してEnterキーを押すのを待つことができます。別の人は最後の入力などで作業できますが..そうですか?

しかし、たくさんの方程式を計算したい場合は、複数のスレッドを使用しても高速にはなりません。とにかく同時に計算できないためです(複数のプロセッサがない場合)。

誰かが私のために物事を片付けることができますか?私はこれについてたくさん読んでみましたが、誰もが同じ言葉を使っているだけで、それは私の問題を解決するのに役立ちません!

4

8 に答える 8

10

しかし: Thread を拡張することで、クラスがスレッドになると思いました。

クラスはスレッドではありません。それらは別個の概念です。スレッドはコードを実行します。何らかのスレッドまたは他のスレッドによって実行されにコードを実行する方法はありません。

クラスを使用して(または別のクラスを使用して)新しいスレッドを作成しますが、実行のスレッドはクラス自体とは別のものです。オブジェクトは、実行スレッドの単なる表現です。コードを実行するために、JVM 自体がスレッド (「メイン」スレッドを含む) を起動します。ThreadThreadThread

スレッドのポイントとスレッドがいつ役立つかについては、ほとんど正しいように思えますが、最近では、プロセッサが 1 つしかないマシンで実行することはほとんどありません。

于 2012-07-30T08:42:29.287 に答える
2

最初の質問に答えるには: はい、すべてのプロセスには少なくとも 1 つのスレッドがあります。Java の場合、メソッドmain (String[] args)はメインスレッドによって実行されます。このスレッドは、プログラムの開始時に JVM によって作成されます。

2 番目の質問について: 長い計算を実行する必要がある場合は、計算を細かく分割し、各部分を別のスレッドで実行すると、パフォーマンスが向上します (そして向上します)。これは、CPU がマルチコアの場合のみです。注: すべての計算/タスクを細かく分割できるわけではありません。

于 2012-07-30T08:47:05.387 に答える
1

では、メインで拡張しないのに、どうしてすべてのプロセスにスレッドがあるのでしょうか。

コードを実行するJava仮想マシンは、OSによって作成されたプロセスです。そのプロセスは順番にスレッドを作成します。そのうちの1つは、メインを実行するスレッド(一般にメインスレッドと呼ばれます)です。そのスレッドはJVMによって自動的に作成されます。

とにかく同時に計算できないため、複数のスレッドを使用しても高速にはなりません(複数のプロセッサがない場合)。

はい、あなたはここにいます。タスクがCPUにバインドされている(何かを計算している)場合、マルチスレッドにすることで、計算を実行するプロセッサが複数ある場合にのみパフォーマンスが向上します。

于 2012-07-30T08:43:36.773 に答える
1

スレッドは単に「実行フロー」を意味します。したがって、メインクラスがある場合; それ自体の内部でのステートメントの実行の通常のフローはスレッドです。プログラムをさらに並列化したい場合は、並列に流れるさまざまな実行フローを追加できます。このためには、Thread、Callable、またはRunnableを拡張するクラスが必要です。

于 2012-07-30T08:44:01.723 に答える
1

ジョンの答えは素晴らしいですが、すべての質問に対応しているわけではありません。他の回答のいくつかは、非常に誤解を招くものです。だから私は2セントを追加すると思った。

... すべてのプロセスには少なくとも 1 つのスレッドがあります。つまり、メインクラスしかない場合、それはスレッドになるということですよね?

右。mainJVM が起動すると、メソッドを呼び出すユーザー スレッドが 1 つあります。ガベージ コレクターやその他のサービスを実行するバックグラウンド スレッドもありますが、それらについて心配する必要はありません。

しかし: Thread を拡張することで、クラスがスレッドになると思いました。

これは少し混乱します。クラスをインスタンス化することで、クラスのインスタンスを作成できます。ただし、これは、メソッドを呼び出すまで、実際には新しいスレッドを開始しません。これは、実行中の新しいスレッドを作成するメソッドです。ThreadMyThreadextends Threadstart()

// creates an instance of the class
MyThread thread = new MyThread();
// actually starts the new thread running
thread.start();

Runnable参考までに、拡張する代わりに実装することをお勧めしますThread:

public class MyRunnable implements Runnable {
   public void run() {
      ...
   }
}
...
// this is how you start a thread with your runnable
Thread thread = new Thread(new MyRunnable());
thread.start();

では、メインでスレッドを拡張しない場合、すべてのプロセスにスレッドがあるのはなぜですか?

mainスレッドは特殊で非定型です。JVM が自動的に開始します。Threadメインクラスをまったく拡張しません。

複数のスレッドを使用すると、同時に使用できる別のリソースを使用する場合にのみ、プロセスが高速になります...

はい。これが、マルチスレッド コードを作成する主な理由の 1 つです。これは、IO (ネットワーク、ディスク) を扱っている場合に特に当てはまります。

しかし、方程式の束を計算したい場合..とにかく同時に計算できないため、複数のスレッドを使用しても高速にはなりません(複数のプロセッサがない場合..)

CPU が 1 つしかなく、プロセッサの計算しかない場合は、正解です。より多くのスレッドを開始しても、プログラムは速くなりません。1 つの CPU に複数の内部 CPU "コア" がある場合は、もちろん速度が向上するはずです。

また、ほとんどの場合、ファイルから入力を読み取ったり、結果をログに書き込んだりしていることを認識することも重要です。私の経験では、真に 100% CPU であるジョブはほとんどありません。

お役に立てれば。コメントで気軽に質問してください。答えを具体化します。

于 2012-07-30T15:25:27.590 に答える
0

プログラムがロードされると、新しいプロセスがセットアップされます。プロセスはリソース管理の単位です。ただし、スレッドはスケジューリングの単位であるため、実行中のすべての Java プログラムには少なくとも 1 つのプロセスがあり、Main.

2 番目の質問については、マルチスレッドが常にプログラムのパフォーマンスを向上させるとは限りません。マルチスレッドでは、スレッド管理のオーバーヘッドが発生します。あなたが主張したように、シングルコアCPUマシンのコンピューティング集約型環境では、プログラムをブーストすることはできません。IO 集約型プログラムもそうではありません。その場合、すべてのスレッドがブロックされ、ユーザー入力を待機する可能性があります。マルチスレッドがより適切な状況は、プログラムがコンピューティングと IO の両方を含む場合です。たとえば、GUI プログラムでは、IO がブロックされたときにコンピューティング スレッドを実行するようにスケジュールできます。たとえば、プログラムはマウス入力を待っている間に GUI をレンダリングできます。

于 2012-07-30T09:28:22.437 に答える
-1

しかし : Thread を拡張することで、クラスがスレッドになると思いました。

まさに、JVM は Thread を拡張するかどうかにかかわらず、すべてのプログラムに対して 1 つのスレッドを作成します。ただし、マルチスレッド アプリケーションが必要な場合は、Thread クラスを拡張する必要があります。したがって、Thread を拡張しない場合、プログラムを実行する Thread は 1 つだけになりますが、プログラムをマルチスレッド化するには、Thread クラスを実装する必要があります。

複数のスレッドを使用すると、同時に使用できる異なるリソースを使用する場合にのみ、プロセスが高速になります。

複数のスレッドを持つことでプログラムの実行速度が向上することは必須ではありません。「アプリケーションにマルチスレッドを適切に実装すると、コードのパフォーマンスを向上させることができます。」スレッドは魔法ではなく、CPU 時間を適切に使用するだけです。

于 2012-07-30T08:56:49.150 に答える