【问题标题】:pass a runnable to a pre-existing thread to be run in Android/Java将可运行对象传递给要在 Android/Java 中运行的预先存在的线程
【发布时间】:2012-05-20 13:40:54
【问题描述】:

我有一个与以下链接相关的问题:What's the difference between Thread start() and Runnable run()

在这个问题中,我看到有人创建可运行对象,然后以两种不同的方式对其进行初始化。那么,这是否意味着您可以在运行时将这些可运行对象传递给其他事物?

我想将代码传递给一个预先存在的线程,以便在该线程的循环中执行。我环顾四周,据我所知,您可能希望创建一个专用的可运行类,如下所示:

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


        }

    }   



}

【问题讨论】:

    标签: android multithreading runnable


    【解决方案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;
            }
    
        }
    

    【讨论】:

    • 所以如果我有多种不同类型的可运行对象作为对象属性,我会从参考列表或其他东西中做同样的事情吗?好像我有一个可运行的数组列表?
    • 看来我的问题也与以下链接有关:stackoverflow.com/questions/7462098/… 我现在确实想一次处理一个,但我仍然对示例中的示例感到有些困惑上面有关如何将信息实际发送到处理程序的链接。或者你只是通过同步来做到这一点?
    • 我发布了一个处理程序线程演示。 runnable 会一一完成。
    • 老兄,你摇滚。非常感谢,这一切都非常好!感谢您对此的所有帮助和耐心等待!
    • 处理线程在 UIThread 上运行,它不应该运行任何与 UI 相关的东西,以防止 UI 滞后。
    猜你喜欢
    • 2011-08-16
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多