我在理解Java中的线程时遇到了一些麻烦,所以我在堆栈交换和其他地方搜索了一些答案。几乎每个答案的摘要都是:
The start method makes sure the code runs in a new thread context.
如果你直接调用run,那么它就像一个普通的方法调用,它将在当前线程的上下文中运行而不是新的。
The start method contains the special code to trigger the new thread; run obviously doesn't have that ability because you didn't include it when you wrote the run method.
第二行是什么意思? 当我创建一个扩展线程类的类的对象然后我使用那个对象调用run()方法时,它怎么可能触发之前的线程?
我正在创建一个新对象,当我直接调用run()方法时,它是否应该自动创建一个新线程?
从我对该答案的理解,如果我有两个类A和B都继承了线程类。首先我在类A的对象上使用start方法,然后我直接在类B的对象上调用run方法,它将在当前线程的上下文中运行,即线程A级?
注意: - 这个可能看起来像一个重复的问题,但我可以向你保证,我已经完成了关于这个主题的大量研究,但我还没有得到满意的答案!
答案 0 :(得分:0)
我正在创建一个新对象,当我直接调用run()方法时,是不是应该自动创建一个新线程?
没有。您只是创建一个表示线程的新Thread
对象。该线程尚未启动,调用run
显然不启动它。如果你调用run
,它将在运行调用代码的任何线程上运行。
从我对该答案的理解,如果我有两个类A和B都继承了线程类。首先,我在A类对象上使用start方法
很好,现在我们已经使用aObject.start()
启动了一个帖子。但是,调用代码仍在主线程上运行。只有run
A
方法中的内容正在新线程上运行。
然后我直接在类B的对象上调用run方法,它会在当前线程的上下文中运行,也就是A类的线程?
正如我之前所说,当前线程仍然是主线程,而不是A
对象所代表的线程。在run
的对象上调用B
只会在主线程上运行其中的任何内容。