каждый раз создание новой темы добавляется в основную группу ThreadGroup - PullRequest
2 голосов
/ 10 июня 2011

Я создаю много экземпляров вида поверхности для просмотра некоторых объектов, но одновременно создается один экземпляр, а затем вызывается SurfaceDestroyed.но поток, который я создаю каждый раз при создании поверхности, добавляется в основную группу ThreadGroup.

Хотя я прерываю и аннулирую его, но он по-прежнему находится в основной группе потоков и создает исключение нехватки памяти.

КодОтрывки: конструктор

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;
            }
        }
    }

ОБНОВЛЕНИЕ Функция Thread.list показывает, что мой прерванный и нулевой поток все еще находится в группе потоков

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]

как их удалить?

Ответы [ 2 ]

1 голос
/ 10 июня 2011

Некоторые вещи, которые нужно искать.

  1. Вы вызываете только _thread = null внутри блока catch - это означает, что для него не будет установлено значение null, если исключение никогда не генерируется.Переместите это внутрь блока finally.
  2. Это исключение, вероятно, никогда не генерируется.Вызов Thread.interrupt () не вызовет его.Это устанавливает флаг прерывания потока в true.Весь этот цикл while довольно странный, и вам, вероятно, следует переписать его.
  3. Вы передаете экземпляр этого в BreedingThread.Убедитесь, что объект не содержит ссылку на ваш вид поверхности навсегда
  4. Простой вызов метода уничтожения вида поверхности не означает, что ссылка будет удалена, если что-то все еще содержит ссылку на нее (как я упоминал в 3 дляпример).
0 голосов
/ 28 марта 2017

Когда вы вызываете «новый поток» и не указываете группу, поток будет добавлен в ту же группу, что и вызывающий (т.е. Thread.currentThread().getThreadGroup()). В вашем случае именно это приводит к тому, что ваши потоки добавляются в «основную» группу потоков. Чтобы изменить это поведение, используйте new Thread(group, this) для указания группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...