如何在Android中线程?

如何在Android中线程?,android,multithreading,Android,Multithreading,我正在开发我的第一个游戏,它运行良好,但显然需要一些优化。最初,我让一切都在一个线程上运行(我使用LunarLander API开始游戏)。从那时起,我在游戏中添加了两个新的线程。它仍然工作得很好,但我看不出有什么改进。我一定是做错了什么 这是基本设置: class GameView extends SurfaceView implements SurfaceHolder.Callback { private Mover mover; private Collider colli

我正在开发我的第一个游戏,它运行良好,但显然需要一些优化。最初,我让一切都在一个线程上运行(我使用LunarLander API开始游戏)。从那时起,我在游戏中添加了两个新的线程。它仍然工作得很好,但我看不出有什么改进。我一定是做错了什么

这是基本设置:

class GameView extends SurfaceView implements SurfaceHolder.Callback {
    private Mover mover;
    private Collider collider;
    private GameThread thread;


    class Mover extends Thread{ 
            //methods
    }
    class Collider extends Thread{ 
            //methods
    }
    class GameThread extends Thread{ 
            //methods
    }

    public GameView(Context context, AttributeSet attrs) {
            mover = new Mover();
            collider = new Collider();
            thread = new GameThread();
            thread.start();
    }

}
然后,在GameThread类中,我在需要时调用其他线程上的方法:

collider.checkCollision();

这是减少主线程负载的正确方法吗?

好吧,在他们推出双核手机之前,多线程在性能改进方面不会给你带来任何好处


当您在其他线程上执行I/O密集型操作时,多线程可以提供帮助(因为它们会将大部分时间都花在I/O上,从而允许主线程继续处理)。但是当你有了CPU密集型的东西,比如碰撞检测,那么你只需要让两个线程争夺一个CPU核心。

好吧,在他们推出双核手机之前,多线程不会为你带来任何性能提升


当您在其他线程上执行I/O密集型操作时,多线程可以提供帮助(因为它们会将大部分时间都花在I/O上,从而允许主线程继续处理)。但是,当你遇到了CPU密集型的事情,比如碰撞检测,那么你只需要让两个线程争夺一个CPU核心。

除了其他人已经指出的以外,我还想提到一些其他概念,这些概念在你进行多线程处理时应该牢记在心:

  • 不要扩展Thread类-给它一个Runnable!()
  • 在启动线程时充分利用。()
  • 如果您具备以下几点的组合,您可能会从多线程中找到最大的好处(我不知道):

  • 你有不止一个核心
  • 您的任务可以彼此独立运行
  • 您需要保持应用程序的部分响应(即GUI),而另一部分执行一些工作(这是一种例外情况,您可以在单个核心上执行多线程处理)
  • 您可以很容易地确定争用的要点,并且可以以合理的方式(无锁、无等待或通过一些同步)来“消除”它们

  • 除了其他人已经指出的内容外,我还想提及一些其他概念,这些概念通常在进行多线程处理时应该牢记在心:

  • 不要扩展Thread类-给它一个Runnable!()
  • 在启动线程时充分利用。()
  • 如果您具备以下几点的组合,您可能会从多线程中找到最大的好处(我不知道):

  • 你有不止一个核心
  • 您的任务可以彼此独立运行
  • 您需要保持应用程序的部分响应(即GUI),而另一部分执行一些工作(这是一种例外情况,您可以在单个核心上执行多线程处理)
  • 您可以很容易地确定争用的要点,并且可以以合理的方式(无锁、无等待或通过一些同步)来“消除”它们

  • 即使你有两个CPU,让碰撞检测依赖于其他线程是确保只有一个CPU得到有效使用的一种可靠方法。@Arafangion:是的,好的,你的线程都需要尽可能地解耦,以最大限度地提高并行性。所以我听说我实际上什么都没做,我应该研究其他优化android脚本的方法,比如Lirik在下面指出的方法?@Snailer,如果你开始使用多线程,我提到的想法会对你有所帮助,但正如其他人所指出的,在你的情况下,没有必要运行多线程,因为它不会提高性能。即使你有两个CPU,让碰撞检测依赖于其他线程是确保只有一个CPU得到有效使用的可靠方法。@Arafangion:是的,很好的一点,为了最大化并行性,您的线程都需要尽可能地解耦。所以我听说我实际上什么都没做,我还应该研究其他优化android脚本的方法,比如Lirik在下面指出的方法?@Snailer,如果你开始使用多线程,我提到的想法将对你有所帮助,但正如其他人所指出的那样——在你的情况下,你不需要运行多线程,因为它不会提高性能。