1

所以我试图找出一些关于线程的信息,并且到处都说每个进程至少有一个线程。这意味着如果我只有一个主类,它将是一个线程,不是吗?

但是:我认为类通过扩展 Thread 成为一个线程。那么,当我不在 main 中扩展它时,为什么每个进程都有一个 Thread 呢?

拥有多个线程只会使过程更快,如果我使用不同的资源,可以同时使用......就像我读入用户的输入,一个线程可以等待用户输入并按回车,而另一个可以使用最后一个输入等等..对吗?

但是,如果我想计算一堆方程.. 使用多个线程不会更快,因为它们无论如何都不能同时计算(如果我没有多个处理器..)

有人可以帮我清理一下吗?我试图阅读很多关于此的内容,但每个人都只是使用相同的词,这对我的问题没有帮助!

4

8 回答 8

10

但是:我认为类通过扩展 Thread 成为一个线程。

类不是线程。它们是不同的概念。线程执行代码;如果不被某个线程或其他线程执行,代码就无法执行。

您使用类创建线程Thread(或使用另一个类为您完成),但执行线程与Thread类本身是分开的。Thread对象只是执行线程的表示。JVM 本身启动线程(包括“主”线程)以执行代码。

听起来你对线程的观点以及它们何时有用……虽然现在很少在只有一个处理器的机器上运行。

于 2012-07-30T08:42:29.287 回答
2

回答您的第一个问题:是的,每个进程至少有 1 个线程。在 Java 的情况下,该方法main (String[] args)由主线程执行。该线程由 JVM 在您启动程序时创建。

关于您的第二个问题:如果必须执行长计算,则将其分解为较小的部分并在不同的线程上运行每个部分可以(并且将会)提高性能。这仅适用于 CPU 是多核 CPU 的情况。注意:并非所有计算/任务都可以分解成更小的部分。

于 2012-07-30T08:47:05.387 回答
1

那么,当我不在 main 中扩展它时,为什么每个进程都有一个 Thread 呢?

执行您的代码的 Java 虚拟机是您的操作系统创建的进程。该进程依次创建线程,其中之一是运行您的主线程(通常称为主线程)的线程。该线程由 JVM 自动创建。

使用多个线程不会更快,因为它们无论如何都无法同时计算(如果我没有多个处理器..)

是的,你就在这里。如果一项任务受 CPU 限制(计算某些东西),那么只有在您有多个处理器来运行计算时,使其成为多线程才能提高性能。

于 2012-07-30T08:43:36.773 回答
1

Thread 简单地表示“执行流”。因此,如果您只有一个主要课程;内部语句的正常执行流程是一个线程。如果您想进一步并行化您的程序,您可以添加不同的执行流程,这些流程将并行执行。为此,您需要扩展 Thread、Callable 或 Runnable 的类。

于 2012-07-30T08:44:01.723 回答
1

乔恩的回答很好,但它并没有解决你所有的问题。其他一些答案极具误导性。所以我想我会加上我的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。

希望这可以帮助。随时在评论中提出问题,我会充实我的答案。

于 2012-07-30T15:25:27.590 回答
0

对于第二个问题:

首先,多线程并不意味着更快:如果您的代码只能按顺序执行,那么多线程对您来说毫无意义,您的任务不能拆分为多个子任务并且不能并发执行。

其次,对于单处理器,多线程可以增加您的系统吞吐量,使您的任务看起来执行得更快。因为 CPU 总是需要等待比它响应慢得多的资源,例如磁盘 I/0、网络,而 OS(JVM) 可以在 CPU 上调度另一个线程继续执行,而不仅仅是等待(单线程场景)

第三,对于多处理器,显然多线程实际上可以并行执行任务。那肯定更快!

于 2012-07-30T09:19:22.680 回答
0

当你的程序加载时,会建立一个新的进程——进程是资源管理的单位;但是,线程是调度的单位,因此每个运行的 Java 程序至少有一个进程来运行您的Main.

至于你的第二个问题:多线程并不总能提升程序性能。多线程将引入线程管理的开销。正如您所声称的,您的程序无法在单核 CPU 机器上的计算密集型环境中得到提升。IO 密集型程序也不会:在这种情况下,所有线程都可能被阻塞等待用户输入。多线程更适合的情况是程序同时涉及计算和IO,例如GUI程序,其中计算线程可以在IO阻塞时调度运行,例如程序可以在等待鼠标输入时渲染GUI。

于 2012-07-30T09:28:22.437 回答
-1

但是:我认为类通过扩展 Thread 成为一个线程。

确切地说,无论您是否扩展 Thread,JVM 都会为每个程序创建一个线程。但是如果你想要一个多线程的应用程序,你必须扩展 Thread 类。所以,如果你不扩展 Thread,你的程序就只有一个 Thread 运行,但是你的程序要多线程,你需要实现 Thread 类。

如果我使用可以同时使用的不同资源,拥有多个线程只会使过程更快。

拥有多个线程可以使程序运行得更快并不是强制性的。我想说“在您的应用程序中正确实现多线程可以提高代码的性能。” 线程不是魔术,它们只是对 CPU 时间的适当利用。

于 2012-07-30T08:56:49.150 回答