Android 每次创建新线程被添加到主线程组时

Android 每次创建新线程被添加到主线程组时,android,multithreading,out-of-memory,threadgroup,Android,Multithreading,Out Of Memory,Threadgroup,我正在创建许多曲面视图实例以查看某些对象,但一次创建一个实例,然后调用surfaceDestroyed。但是我每次在surfacecreated上创建的线程都被添加到主线程组中 虽然我正在中断并取消它,但它仍然驻留在主线程组中,并创建内存不足异常 代码片段: 建造师 public class MsurfaceView extends SurfaceView implements SurfaceHolder.Callback { _thread = new mThread(this

我正在创建许多曲面视图实例以查看某些对象,但一次创建一个实例,然后调用surfaceDestroyed。但是我每次在surfacecreated上创建的线程都被添加到主线程组中

虽然我正在中断并取消它,但它仍然驻留在主线程组中,并创建内存不足异常

代码片段: 建造师

public class MsurfaceView extends SurfaceView implements
        SurfaceHolder.Callback {
_thread = new mThread(this);
   _thread.setName("mThread");


@Override
    public void surfaceCreated(SurfaceHolder holder) {

        if (!_thread.isAlive()) {
            _thread = new BreedingThread(this);
        }

        _thread.setRunning(true);
        _thread.start();

    }





@Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.d("mThread", "Surface Destroyed Called");
        getHolder().removeCallback(this);
        getHolder().addCallback(null);

        boolean retry = true;
        _thread.setRunning(false);

        while (retry) {
            try {
                _thread.interrupt();
                _thread.getThreadGroup().interrupt();
                _thread.join();
                retry = false;
            } catch (InterruptedException e) {
                Log.d("mThread", "Interrupted");
                // pass interrupt exception
                Thread.currentThread().interrupt(); 
                Log.d("mThread", "b4 threadGroupInterrupted");
                _thread.getThreadGroup().interrupt();
                _thread.getThreadGroup().list();//this shows thread is in //list
                _thread = null;
                break;
            }
        }
    }
更新 函数显示我的中断线程和空线程仍在threadgroup中

06-10 15:22:52.780: INFO/System.out(1814): java.lang.ThreadGroup[name=main,maxPriority=10]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[main,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Thread-2,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Binder Thread #1,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Binder Thread #2,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[FlurryAgent,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[AsyncTask #1,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[AsyncTask #2,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Thread-17,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[mThread,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[mThread,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[mThread,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Thread-38,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Timer-2,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[mThread,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[mThread,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Thread-53,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Thread-286,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Thread-327,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Thread-359,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[mThread,5,main]
06-10 15:22:52.780: INFO/System.out(1814):     Thread[Thread-409,5,main]

如何删除它们?

一些需要查找的内容

  • 您只在catch块内调用_thread=null-这意味着如果从未抛出异常,它将不会被设置为null。把它移到最后一个街区里
  • 这个异常可能永远不会被抛出。调用Thread.interrupt()不会抛出它。将线程的中断标志设置为true。整个while循环相当奇怪,您可能应该重新编写它
  • 您正在将此实例传递给BreedingThread。确保对象不会永远保留对曲面视图的引用
  • 简单地调用surface view destroy方法并不意味着如果某个对象仍然持有对它的引用(例如我在3中提到的),那么该引用将被删除

  • 当您调用“新线程”且未指定组时,该线程将被添加到与调用者相同的组中(即
    Thread.currentThread().getThreadGroup()
    )。在您的情况下,这就是导致您的线程被添加到“主”线程组的原因。要更改该行为,请使用
    新线程(组,this)
    指定组。

    未完成代码;只是为了理解代码片段。我正在创建这个surfaceview和这个线程,正如我在你的另一个线程中所说的。你不需要移除它们,也不应该移除它们。相反,您应该更正代码,以便终止线程,而不引用它们。hProf分析显示,只有主线程组引用了我的BreedingThread,这意味着线程仍在执行.System.out.println(“isRunning”+_thread.isRunning());=>false System.out.println(“isAlive”+_thread.isAlive());=>truelog打印出正在中断的线程。我将hprof与内存分析器一起使用,只显示breedingThread正在造成内存溢出的混乱,并且surface view的所有实例都已从内存中清除。我正在坦克_thread=null;到最后。thnx请帮忙