Java 为什么不';线程start和run方法没有返回任何内容吗?
我想知道为什么Thread.start(现有的JDK1.0)方法设计为不返回对象。我知道开发人员可以使用callable,它与JDK1.5类似,但很晚才出现。我知道人们可以使用一种变通方法,比如在线程构造函数中传递一个结果容器来包含线程结果,但我还是想知道为什么它不是设计用来返回结果的 我是不是遗漏了什么?它在设计方面是好的(比如消除了显式返回null的需要,即使它不是必需的)还是一种设计 缺陷?Java 为什么不';线程start和run方法没有返回任何内容吗?,java,multithreading,Java,Multithreading,我想知道为什么Thread.start(现有的JDK1.0)方法设计为不返回对象。我知道开发人员可以使用callable,它与JDK1.5类似,但很晚才出现。我知道人们可以使用一种变通方法,比如在线程构造函数中传递一个结果容器来包含线程结果,但我还是想知道为什么它不是设计用来返回结果的 我是不是遗漏了什么?它在设计方面是好的(比如消除了显式返回null的需要,即使它不是必需的)还是一种设计 缺陷?Thread.start()仅启动线程执行并返回。通常在返回时,线程仍在执行,甚至等待开始执行,因此
Thread.start()
仅启动线程执行并返回。通常在返回时,线程仍在执行,甚至等待开始执行,因此还没有返回结果。由于此时没有返回任何内容,因此不让Thread.start()
返回任何内容是有意义的
Thread.run()
通常不会被代码调用,因为调用它会在现有线程中运行该方法,而不是在新线程中运行。相反,在JVM创建新线程后,新线程中的Java虚拟机(JVM)会调用Thread.run()
。JVM代码当然不知道线程应该做什么,也不知道如何处理返回值,因此thread.run()
也没有返回值。thread.start()
只是开始线程执行并返回。通常在返回时,线程仍在执行,甚至等待开始执行,因此还没有返回结果。由于此时没有返回任何内容,因此不让Thread.start()
返回任何内容是有意义的
Thread.run()
通常不会被代码调用,因为调用它会在现有线程中运行该方法,而不是在新线程中运行。相反,在JVM创建新线程后,新线程中的Java虚拟机(JVM)会调用Thread.run()
。JVM代码当然不知道线程应该做什么,也不知道如何处理返回值,因此thread.run()
也没有返回值。实际上没有返回值Thread.start()
仅将此线程“放入”内部执行计划程序。这并不意味着线程立即开始执行代码。当内部调度程序决定线程已准备好执行时—它将从run()
方法开始执行代码—当然可以随时切换到执行另一个线程 真的没有什么可以回报的了Thread.start()
仅将此线程“放入”内部执行计划程序。这并不意味着线程立即开始执行代码。当内部调度程序决定线程已准备好执行时—它将从run()
方法开始执行代码—当然可以随时切换到执行另一个线程 在您看来,该方法应该返回什么?我无法想象一个适用于大多数线程的通用解决方案。而且,我的大多数线程甚至都不是为返回结果而设计的。我的意思是使用线程的唯一目标是并行执行代码。在很多情况下,您希望执行不返回结果的代码。还返回一个结果意味着存在某种连接结果的监控过程,也有很多情况下你没有这个。所以默认的解决方案是返回void,但是你可以扩展线程
,并用你自己的结果类和getResult
方法引入一个结果字段。例如,像ThreadWithResult这样的类扩展了Thread
。我不知道他们为什么要这样设计Callable
,你可能会对这两个版本都有争议——有结果的和没有结果的。一个可能的原因可能是引入了泛型,因为如果没有泛型,“可调用的
”就很难使用。要回答您的问题,您认为该方法应该返回什么
,就像Callable一样。这在JDK1.0中可能是不可能的,因为泛型是在很久以后才出现的。是的,它们是在版本1.5中出现的,正好是Callable
出现的地方。那么,这也是我的猜测。你打算如何使用这个结果?你认为这个方法应该返回什么?我无法想象一个适用于大多数线程的通用解决方案。而且,我的大多数线程甚至都不是为返回结果而设计的。我的意思是使用线程的唯一目标是并行执行代码。在很多情况下,您希望执行不返回结果的代码。还返回一个结果意味着存在某种连接结果的监控过程,也有很多情况下你没有这个。所以默认的解决方案是返回void,但是你可以扩展线程
,并用你自己的结果类和getResult
方法引入一个结果字段。例如,像ThreadWithResult这样的类扩展了Thread
。我不知道他们为什么要这样设计Callable
,你可能会对这两个版本都有争议——有结果的和没有结果的。一个可能的原因可能是引入了泛型,因为如果没有泛型,“可调用的
”就很难使用。要回答您的问题,您认为该方法应该返回什么
,就像Callable一样。这在JDK1.0中可能是不可能的,因为泛型是在很久以后才出现的。是的,它们是在版本1.5中出现的,正好是Callable
出现的地方。所以,这也是我的猜测。你将如何使用这个结果?