我正在研究一个问题,我将每个实例的任务都发布到执行程序中,并且一旦该实例的工作已从内存中清除,我便在一系列强制垃圾回收之后进行了内存转储,但是无法能够找到持有执行人的任何实例。但是我仍然可以看到,执行器创建的线程仍然存在于CPU中,但处于睡眠状态,并且在应用程序生命周期中一直存在,我不知道如何清除它或将其从CPU中删除。
这种情况并非每次都发生,有时不从内存中清除。但主要是它已被清除。但是,如果这种情况持续发生,则设备可能最终将导致OutOfMemory(OOM)崩溃,因为它无法创建更多线程。
我尝试在执行器上调用shutdown()
方法,该方法似乎也无法正常工作。
class MyThread extends Thread {
MyThread(Runnable r, String name) {
super(r, name);
}
}
class YourThreadFactory implements ThreadFactory {
int thread = -1;
YourThreadFactory() {
}
@Override
public Thread newThread(@NonNull Runnable r) {
thread = SomeStaticClass.thread++;
return new MyThread(r, "MyThread " + thread);
}
@Override
protected void finalize() throws Throwable {
super.finalize();
Log.d("ThreadFactory", Thread.currentThread().getName() + " " + " Executor removed " + thread);
}
}
ExecutorService mSingleThreadExecutor = Executors.newSingleThreadExecutor(new YourThreadFactory());
恕我直言,您做错了:
您可能应该将此线程绑定到android应用程序的作用域(假设您具有android标签,则该线程与android相关)。您可以使用interrupt
,然后将线程实例设置为null。
您已经定义了Executors.newSingleThreadExecutor()
,它最多只会创建一个线程。如果您的应用程序达到了最大线程的内核限制,则说明正在创建线程,而不是此仅具有一个线程的ExecutorService
对象。