仍然在CPU中显示执行器线程

问题描述 投票:0回答:3

我正在研究一个问题,我将每个实例的任务都发布到执行程序中,并且一旦该实例的工作已从内存中清除,我便在一系列强制垃圾回收之后进行了内存转储,但是无法能够找到持有执行人的任何实例。但是我仍然可以看到,执行器创建的线程仍然存在于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());

java android multithreading executorservice threadpoolexecutor
3个回答
0
投票

恕我直言,您做错了:

  1. 您永远不要使用finalize()

0
投票

您可能应该将此线程绑定到android应用程序的作用域(假设您具有android标签,则该线程与android相关)。您可以使用interrupt,然后将线程实例设置为null。


0
投票

您已经定义了Executors.newSingleThreadExecutor(),它最多只会创建一个线程。如果您的应用程序达到了最大线程的内核限制,则说明正在创建线程,而不是此仅具有一个线程的ExecutorService对象。

© www.soinside.com 2019 - 2024. All rights reserved.