передать исполняемый файл в уже существующий поток для запуска в Android/Java

У меня есть вопрос, связанный со следующей ссылкой: Что такое разница между Thread start() и Runnable run()

В этом вопросе я вижу человека, создающего исполняемые объекты, а затем инициализирующего их двумя разными способами. Итак, означает ли это, что вы можете передавать эти runnables другим вещам во время выполнения?

Я хочу передать код уже существующему потоку, который будет выполняться в цикле этого потока. Я огляделся и, насколько я могу судить, вы хотели бы создать выделенный исполняемый класс, например следующий:

    public class codetobesent implements Runnable  
     {  
       public void run()  
        {   
        ..morecodehere.  
        }  
      ...insertcodestuffhere  
     }  

Но как мне передать это потоку, который уже запущен? Скажем, я пытаюсь сделать игру, и у меня есть что-то особенное, что я хочу, чтобы рендерер сделал в своем потоке. Как я могу передать этот исполняемый файл этому потоку и правильно запустить эти данные?

Моя текущая реализация моего потока рендеринга выглядит следующим образом, я взял ее с учебного сайта, и до сих пор она работала довольно хорошо. Но я хочу знать, как передать ему что-то, чтобы я мог запускать больше, чем просто в предустановленном цикле.

class RenderThread extends Thread 
{
private SurfaceHolder _curholder;
private UserView curview;
private boolean runrender = false; 

    public RenderThread (SurfaceHolder holder, UserView thisview)
    { //Constructor function - This gets called when you create a new instance of this object.
        curview = thisview;
        _curholder = holder;
    }

    public SurfaceHolder getThreadHolder()
    {
        return _curholder;
    }
    public void setRunning(boolean onoff) 
    {
        runrender = onoff;
    }
    @Override
    public void run() 
    {
        Canvas c;
        while (runrender)
        {
            c = null; //first clear the object buffer.
            try 
            {
              c = _curholder.lockCanvas(null); //lock the canvas so we can write to it
              synchronized (_curholder) 
              {//we sync the thread with the specified surfaceview via its surfaceholder.
                  curview.onDraw(c);
              }

            } 

            finally 
            {
              // do this in a finally so that if an exception is thrown
              // during the above, we don't leave the Surface in an
              // inconsistent state
                if (c != null) 
                {
                    _curholder.unlockCanvasAndPost(c);
                }
            }


        }

    }   



}

person Apothem Da Munster    schedule 12.05.2012    source источник


Ответы (1)


Реализация потока обработчика.

private void testWorker(){
        WorkerThread worker = new WorkerThread();
        worker.start();
        for (int i = 0; i < 10; i++) {
            worker.doRunnable(new Runnable() {
                public void run() {
                    Log.d("demo", "just demo");
                    try {
                        Thread.sleep(1000);//simulate long-duration operation.
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                };
            });
        }
    }

    private class WorkerThread extends HandlerThread implements Callback {

        private Handler mHandler;

        public WorkerThread() {
            super("Worker");
        }

        public void doRunnable(Runnable runnable) {
            if (mHandler == null) {
                mHandler = new Handler(getLooper(), this);
            }
            Message msg = mHandler.obtainMessage(0, runnable);
            mHandler.sendMessage(msg);
        }

        @Override
        public boolean handleMessage(Message msg) {
            Runnable runnable = (Runnable) msg.obj;
            runnable.run();
            return true;
        }

    }
person Changwei Yao    schedule 12.05.2012
comment
Так что, если у меня есть несколько различных типов runnables, которые действуют как свойство объекта, я бы просто сделал то же самое из списка ссылок или что-то в этом роде? Как если бы у меня был список runnables, который можно было бы использовать? - person Apothem Da Munster; 12.05.2012
comment
Кажется, мой вопрос также связан со следующей ссылкой: -other" title="handlerthread vs executor, когда один из них более уместен, чем другой"> stackoverflow.com/questions/7462098/ Сейчас я хочу выполнять свои процессы по одному, но я все еще немного запутался в примере по приведенной выше ссылке о том, как на самом деле ОТПРАВИТЬ информацию обработчику. Или вы просто делаете это с помощью синхронизации? - person Apothem Da Munster; 12.05.2012
comment
Я публикую демонстрацию потока обработчика. Runnable будет выполняться один за другим. - person Changwei Yao; 12.05.2012
comment
Чувак, ты крут. Большое спасибо, все проясняется исключительно хорошо! Я ценю всю вашу помощь и терпение с этим! - person Apothem Da Munster; 12.05.2012
comment
Поток обработчика запускается в UIThread, который не должен запускать ничего, кроме материалов, связанных с пользовательским интерфейсом, чтобы предотвратить задержку пользовательского интерфейса. - person Kai; 12.05.2012
comment
Вы можете установить ссылку обработчика основного потока пользовательского интерфейса на HandlerThread. и обновите пользовательский интерфейс, отправив сообщение обратно. - person Changwei Yao; 12.05.2012
comment
Итак, я могу создать WorkerThread внутри другого класса, который расширяет Thread? - person Apothem Da Munster; 12.05.2012
comment
Итак, расширяя поток обработчика, он в любом случае действует как собственный поток. Пожалуйста, простите меня за все дополнительные вопросы, я все еще новичок в многопоточности, но у меня была последняя вещь, которую я хотел спросить об этом: Итак, мой вопрос теперь, когда вы используете mHandler.sendMessage(msg), вы отправляете исполняемый в очередь сообщений, которую mHandler имеет, создав ее внутри вашего класса объекта HandlerThread? Правильно ли мое предположение, или mHandler.sendMessage отправляет его куда-то еще или делает что-то другое? - person Apothem Da Munster; 12.05.2012
comment
ты прав. Обработчик Thread looper позаботится об очереди сообщений. - person Changwei Yao; 12.05.2012