乔恩的回答很好,但它并没有解决你所有的问题。其他一些答案极具误导性。所以我想我会加上我的2美分。
...每个进程至少有一个线程。这意味着如果我只有一个主类,它将是一个线程,不是吗?
对。当 JVM 启动时,有一个调用该main
方法的用户线程。还有运行垃圾收集器和其他服务的后台线程,但您不必担心它们。
但是:我认为类通过扩展 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 中扩展它时,为什么每个进程都有一个 Thread 呢?
线程是特殊的main
和非典型的。JVM 会为您启动它。你根本没有Thread
在你的主类中扩展。
拥有多个线程只会使过程更快,如果我使用不同的资源,可以同时使用......
是的。这是我们编写多线程代码的主要原因之一。在处理 IO(网络、磁盘)时尤其如此。
但是,如果我想计算一堆方程.. 使用多个线程不会更快,因为它们无论如何都不能同时计算(如果我没有多个处理器..)
如果您只有一个 CPU 并且只有处理器计算,那么您是正确的。通过启动更多线程,您的程序不会变得更快。如果您的一个 CPU 有多个内部 CPU“核心”,那么您当然应该提高速度。
同样重要的是要意识到在大多数情况下,您是从文件中读取输入或将结果写入日志。根据我的经验,很少有工作是真正 100% 的 CPU。
希望这可以帮助。随时在评论中提出问题,我会充实我的答案。