我遇到了通过多个线程执行实例方法的顺序问题。
我有我的类和线程结构,如下所述。
对于MainObj
的实例,方法lastExcec()
应在thirdExec()
之后执行。
方法thirdExec()
由一个线程序列调用,该序列旋转3个级别的匿名线程。
mehtod lastExcec()
由另一个稍后启动但具有一级匿名线程的线程调用。
//The class that initiates the process
ThreadExecuter
{
ThreadExecuter()
{
MainObj anObj = new MainObj();
.
.
.
.
anObj.lastExec();
}
}
// The class that has the in which the mentioned methods present
MainObj
{
// first get executed from constructor through anon thread.
MainObj()
{
new Thread()
{
run()
{
firstExec();
}
}
}
// first executes second through anon thread
firstExec()
{
new Thread()
{
run()
{
secExec();
}
}
}
//sec executes third through an anonymous thread
secExec()
{
new Thread()
{
run()
{
thirdExec();
}
}
}
thirdExec()
{
}
// last should be executed after thrid
lastExcec()
{
}
}
答案 0 :(得分:1)
我遇到了通过多个线程执行实例方法的顺序问题。
编写多线程应用程序的重点是线程异步并行工作。如果您需要或想要特定的操作订单,那么您通常需要编写代码来确保它。
在您的情况下,我相信您在询问为什么在调用其他线程的方法之前主线程调用lastExcec()
方法。这是因为主线程可能没有等待其他线程完成。它分叉子线程并继续与它们并行执行。 Thread.start()
方法通常花费一些时间,因此在任何其他线程实际开始执行之前可以调用lastExec()
。
如果您需要等待特定线程,则需要使用thread.join()
加入它。这对您的代码来说很困难,因为线程对象是匿名的,并且是在MainObj
内创建的。
还有一条评论。在对象构造函数中分叉线程被认为是一种糟糕的模式。这是因为您很可能将this
的引用泄露给其他可能在完全构造之前使用该对象的线程。最好在start()
上添加一个MainObj
方法,它实际上启动了在构造函数中创建的线程。