ジョンの答えは素晴らしいですが、すべての質問に対応しているわけではありません。他の回答のいくつかは、非常に誤解を招くものです。だから私は2セントを追加すると思った。
... すべてのプロセスには少なくとも 1 つのスレッドがあります。つまり、メインクラスしかない場合、それはスレッドになるということですよね?
右。main
JVM が起動すると、メソッドを呼び出すユーザー スレッドが 1 つあります。ガベージ コレクターやその他のサービスを実行するバックグラウンド スレッドもありますが、それらについて心配する必要はありません。
しかし: Thread を拡張することで、クラスがスレッドになると思いました。
これは少し混乱します。クラスをインスタンス化することで、クラスのインスタンスを作成できます。ただし、これは、メソッドを呼び出すまで、実際には新しいスレッドを開始しません。これは、実行中の新しいスレッドを作成するメソッドです。Thread
MyThread
extends Thread
start()
// 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 であるジョブはほとんどありません。
お役に立てれば。コメントで気軽に質問してください。答えを具体化します。