我创建了一个非分离的线程,可以通过2种不同的方法来停止。其中一个(mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent e) {
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_POINTER_UP:
recyclerView.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
return false;
}
}
)通过连接到生成的线程提供同步接口,而另一个(stop()
)只是将控制变量stopAsync()
设置为false并且不等待提到的线程完成。
m_continue
如果调用void run()
{
while(m_continue)
{
// Do something
}
}
void start()
{
m_continue = true;
// Spawn a new thread for run()
}
void stop()
{
m_continue = false;
// Join to the spawned thread
}
void stopAsync()
{
m_continue = false;
}
,stopAsync()
方法中的while循环结束但没有人加入该线程。这种情况有资源泄漏吗?是否必须加入非分离的线程?
我无法从文档中找到答案。 ' Notes'部分讲述了我无法理解的事情。
线程可以是可连接的也可以是分离的。如果一个线程是可连接的,那么另一个线程可以调用pthread_join(3)来等待线程终止并获取其退出状态。 仅当已终止的可连接线程已加入时,其最后一个资源才会释放回系统。当分离的线程终止时,其资源会自动释放回系统:无法加入与线程,以获得其退出状态。分离线程对某些类型的守护程序线程非常有用,这些守护程序线程的退出状态是应用程序不需要关心的。默认情况下,在可连接状态下创建新线程,除非将attr设置为以分离状态创建线程(使用pthread_attr_setdetachstate(3))。
答案 0 :(得分:0)
仅当已终止的可连接线程已加入时,其最后一个资源才会释放回系统。
这部分文档的含义是,如果你没有加入,那么线程的某些资源将在退出后保持分配状态。这样做类似于在没有malloc()
的情况下调用free()
- 它不是"强制性的"从某种意义上说,如果你没有,它不会导致你的程序立即出现问题,但 代表资源泄漏,所以如果你长期重复这样做程序你可以耗尽相关的资源。
在设置标志变量之前,stopAsync()
只需在另一个线程上调用pthread_detach()
代替加入线程。
请注意,您的m_continue
变量应受同步原语(如互斥锁或读写器锁)的保护。