所以我试图找出一些关于线程的信息,到处都说每个进程都至少有一个线程。这意味着如果我只有一个主类,它将是一个线程,不是吗?
但是:我认为该类通过扩展线程而成为线程。那么为什么每个进程都有一个线程,当我不在 main 中扩展它时?
拥有多个线程只会使过程更快,如果我使用不同的资源,可以同时使用......就像如果我从用户那里读入输入一样,一个线程可以等待用户输入并按 Enter 键,而另一个线程可以使用最后一个输入,依此类推。右?
但是如果我想计算一堆方程......使用多个线程不会更快,因为它们无论如何都无法同时计算(如果我没有几个处理器......
有人可以为我澄清事情吗?我试图阅读很多关于这个的内容,但每个人都使用相同的词,这对我的问题没有帮助!
但是:我认为该类通过扩展线程而成为线程。
类不是线程。它们是不同的概念。线程执行代码;如果不由某个线程或其他线程执行,代码就无法执行。
您可以使用 Thread
类(或使用另一个类为您执行此操作(创建新线程,但执行线程与 Thread
类本身是分开的。Thread
对象只是执行线程的表示形式。JVM本身启动线程(包括"主"线程(以执行代码。
听起来您对线程的要点以及它们何时有用的看法大多是正确的......尽管如今很少在只有一个处理器的机器上运行。
回答您的第一个问题:是的,每个进程至少有 1 个线程。在 Java 的情况下,方法 main (String[] args)
由主线程执行。此线程由 JVM 在您启动程序时创建。
关于你的第二个问题:如果必须执行长计算,那么将其分解成更小的部分并在不同的线程上运行每个部分可以(并且将(提高性能。仅当 CPU 是多核时,这才是最重要的。注意:并非所有计算/任务都可以分成更小的部分。
只是意味着"执行流"。所以如果你只有一个主类;自身内部语句的正常执行流程是一个线程。如果你想进一步并行化你的程序,你可以添加不同的执行流,这些流将并行流动。为此,您需要扩展线程,可调用或可运行的类。
那么为什么每个进程都有一个线程,当我不在 main 中扩展它时?
执行代码的 Java 虚拟机是由您的操作系统创建的进程。该过程依次创建线程,其中一个线程是运行主线程的线程(通常称为主线程(。该线程由 JVM 自动创建。
使用多个线程不会更快,因为它们无论如何都无法同时计算(如果我没有多个处理器......
是的,你就在这里。如果任务受 CPU 限制(计算某些内容(,则仅当有多个处理器运行计算时,使其成为多线程只会提高性能。
乔恩的回答很好,但它并没有解决你的所有问题。 其他一些答案极具误导性。 所以我想我会加上我的2美分。
。每个进程至少有一个线程。这意味着如果我只有一个主类,它将是一个线程,不是吗?
右。 当 JVM 启动时,有一个用户线程调用 main
方法。 还有一些后台线程运行垃圾收集器和其他服务,但您不必担心它们。
但是:我认为该类通过扩展线程而成为线程。
这有点令人困惑。 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 中扩展它时?
main
线程是特殊和非典型的。 JVM 会为您启动它。 您根本不会在主类中扩展Thread
。
拥有多个线程只会使过程更快,如果我使用不同的资源,可以同时使用......
是的。 这是我们编写多线程代码的主要原因之一。 当您处理 IO(网络、磁盘(时尤其如此。
但是如果我想计算一堆方程......使用多个线程不会更快,因为它们无论如何都无法同时计算(如果我没有几个处理器......
如果您只有一个 CPU 并且只有处理器计算,那么您是正确的。 启动更多线程不会使您的程序变得更快。 如果您的一个CPU有多个内部CPU"内核",那么您当然应该获得速度提升。
同样重要的是要认识到,在大多数情况下,您是从文件中读取输入或将结果写入日志。 根据我的经验,很少有工作是真正 100% CPU 的。
希望这有帮助。 请随时在评论中提问,我会充实我的答案。
首先,多线程并不意味着对于第二个问题:
更快:如果你的代码只能按顺序执行,那么多线程对你来说没有任何意义,你的任务不能拆分为多个子任务,不能并发执行。
其次,对于单处理器,多线程可以增加系统吞吐量,从而使您的任务看起来执行得更快。因为 CPU 总是需要等待比它慢得多的资源来响应,例如磁盘 I/0、网络,而 OS(JVM( 可以调度 CPU 上的另一个线程连续执行而不仅仅是等待(单线程场景(
第三,对于多处理器来说,显然多线程实际上可以并行执行任务。 这绝对更快!
当你的程序加载时,将设置一个新进程——进程是资源管理的单元;但是,线程是调度的单元,因此每个正在运行的Java程序至少有一个进程来运行你的Main
。
至于你的第二个问题:多线程并不总是能提高程序性能。多线程将引入线程管理的开销。您的程序不能像您声称的那样在单核 CPU 机器上的计算密集型环境中得到提升。IO 密集型程序也不会:在这种情况下,所有线程都可能被阻塞,等待用户输入。多线程更合适的情况是程序同时涉及计算和IO,例如GUI程序,其中计算线程可以调度在IO阻塞时运行,例如程序可以在等待鼠标输入的同时渲染GUI。
但是:我认为该类通过扩展线程而成为线程。
确切地说,JVM为每个程序创建一个线程,无论您是否扩展Thread。但是如果你想要一个多线程应用程序,你必须扩展 Thread 类。因此,如果您不扩展 Thread,则只有一个线程运行您的程序,但为了使您的程序是多线程的,您需要实现 Thread 类。
拥有多个线程只会使过程更快,如果我使用不同的资源,可以同时使用。
拥有多个线程会使程序运行得更快并不是强制性的。我会说"在您的应用程序中正确实现多线程可以提高代码的性能。线程不是魔法,它们只是对 CPU 时间的适当利用。