这是我正在处理的通用代码。问题是如何在所有子线程都已执行且main_thread处于睡眠状态之前停止2nd_thread。同样,main_thread也将等待返回,以执行while循环执行。如果main_thread当前正在执行,它将等到2nd_thread执行完毕。
我想到了使用可以由线程修改的全局变量来通知2nd_thread是否应该开始执行。但是,可能导致多个线程同时访问全局变量。
我什至想到了用静态对象锁定sub_threads,main_thread和2nd_thread,但是如果我锁定sub_threads,那么就不再有sub_threads的多线程了。
怎么解决呢?
void main()
{
//Do something here
Thread thread1 = new thread(main_thread);
thread1.start();
//Do something here
if(something) //Button event
{
Thread thread2 = new Thread(2nd_thread)
thread2.start();
}
}
void main_thread()
{
while(true)
{
//Do something
if(after something, if condition true)
{
new Thread(sub_thread).start();
}
//Do something
Thread.sleep(_sometime_);
}
}
void 2nd_thread()
{
//This thread must execute only if main_thread is sleeping
//and all sub_threads have been executed. Till then wait for
//other threads to execute.
}
void sub_thread()
{
//Do something
}
无需尝试其他线程框架,您就可以使用CountDownEvent实现您想要的功能(问题中实际上遗漏了许多细节,但这可以为您提供一个良好的开端)。
声明一个共享的CountDownEvent。假设main_thread产生的工作线程数预先为knwon,则可以使用该数目初始化事件。工作人员中的最后一行代码将减少Signal()
计数器。
2nd_thread的第一行代码将Wait()
在该事件上。因此,只有当其内部计数达到零(即所有工作线程都已完成)时,它才会恢复执行。
如果您不提前知道工作人员的数量,则每个新工作人员都可以动态地增加计数器,但是您将需要处理各种竞争条件(例如第一个线程有机会增加第一个工作线程之前,第二个线程开始工作)。柜台..)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句