Java android中线程的工作原理

Java android中线程的工作原理,java,android,multithreading,Java,Android,Multithreading,你能解释一下线程是如何工作的吗。事实上,它现在运行得很好,但我想了解背后的逻辑。我认为这给了我一个同时做两次计算的机会,所以我不必等待第一次计算和。但是如何使用它呢?第一次计算放在哪里,第二次计算放在哪里?在C++中,当我分裂时,必须得到进程ID,然后如果(PID==1){//第一计算}/P>,我必须使用一个IF。 我的课程是: 我有一个a类,这是我的主要活动 aClassB:使用扩展到SurfaceView的内容视图 和一个ClassC:用作扩展到线程的游戏循环 这是: ClassA: pub

你能解释一下线程是如何工作的吗。事实上,它现在运行得很好,但我想了解背后的逻辑。我认为这给了我一个同时做两次计算的机会,所以我不必等待第一次计算和。但是如何使用它呢?第一次计算放在哪里,第二次计算放在哪里?在C++中,当我分裂时,必须得到进程ID,然后如果(PID==1){//第一计算}/P>,我必须使用一个IF。 我的课程是: 我有一个a类,这是我的主要活动 aClassB:使用扩展到SurfaceView的内容视图 和一个ClassC:用作扩展到线程的游戏循环

这是: ClassA:

public class ClassA extends Activity{ 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                               WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(new ClassB(this));
    }
}
public class ClassB extends SurfaceView{
//Variables.......................
    private ClassC GameLoop;
//Constructor.....................    
    public GameView(final Context context) {
        super(context);

        GameLoop = new ClassC(this);
        Holder=getHolder();
        Holder.addCallback(new SurfaceHolder.Callback() {
            public void surfaceDestroyed(SurfaceHolder holder) {
                // TODO Auto-generated method stub
            }
            public void surfaceCreated(SurfaceHolder holder) {
                // TODO Auto-generated method stub
            }
            public void surfaceChanged(SurfaceHolder/// blaa bla
                // TODO Auto-generated method stub
            }
        });
        this.setOnTouchListener(new OnTouchListener()
        {    
            //@Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
            }
        });
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.GREEN);
        //Using canvas and drawing something on it.
    }
}
public class ClassC extends Thread {//GameLoop
    private ClassB view;
    private boolean running = false;

    public ClassC(ClassB view) {
        this.view = view;
    }
    public void setRunning(boolean run) {
          running = true;
    }
    @Override
    public void run() {
        while (running) {
           Canvas c;
           try {
               c = view.getHolder().lockCanvas();
               synchronized (view.getHolder()) {
                   view.onDraw(c);// Here I call onDraw to draw everything
               }
           } finally {
               if (c != null) {
                   view.getHolder().unlockCanvasAndPost(c);
               }
           }
        }
    }
}
ClassB:

public class ClassA extends Activity{ 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                               WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(new ClassB(this));
    }
}
public class ClassB extends SurfaceView{
//Variables.......................
    private ClassC GameLoop;
//Constructor.....................    
    public GameView(final Context context) {
        super(context);

        GameLoop = new ClassC(this);
        Holder=getHolder();
        Holder.addCallback(new SurfaceHolder.Callback() {
            public void surfaceDestroyed(SurfaceHolder holder) {
                // TODO Auto-generated method stub
            }
            public void surfaceCreated(SurfaceHolder holder) {
                // TODO Auto-generated method stub
            }
            public void surfaceChanged(SurfaceHolder/// blaa bla
                // TODO Auto-generated method stub
            }
        });
        this.setOnTouchListener(new OnTouchListener()
        {    
            //@Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
            }
        });
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.GREEN);
        //Using canvas and drawing something on it.
    }
}
public class ClassC extends Thread {//GameLoop
    private ClassB view;
    private boolean running = false;

    public ClassC(ClassB view) {
        this.view = view;
    }
    public void setRunning(boolean run) {
          running = true;
    }
    @Override
    public void run() {
        while (running) {
           Canvas c;
           try {
               c = view.getHolder().lockCanvas();
               synchronized (view.getHolder()) {
                   view.onDraw(c);// Here I call onDraw to draw everything
               }
           } finally {
               if (c != null) {
                   view.getHolder().unlockCanvasAndPost(c);
               }
           }
        }
    }
}
ClassC:

public class ClassA extends Activity{ 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                               WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(new ClassB(this));
    }
}
public class ClassB extends SurfaceView{
//Variables.......................
    private ClassC GameLoop;
//Constructor.....................    
    public GameView(final Context context) {
        super(context);

        GameLoop = new ClassC(this);
        Holder=getHolder();
        Holder.addCallback(new SurfaceHolder.Callback() {
            public void surfaceDestroyed(SurfaceHolder holder) {
                // TODO Auto-generated method stub
            }
            public void surfaceCreated(SurfaceHolder holder) {
                // TODO Auto-generated method stub
            }
            public void surfaceChanged(SurfaceHolder/// blaa bla
                // TODO Auto-generated method stub
            }
        });
        this.setOnTouchListener(new OnTouchListener()
        {    
            //@Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
            }
        });
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.GREEN);
        //Using canvas and drawing something on it.
    }
}
public class ClassC extends Thread {//GameLoop
    private ClassB view;
    private boolean running = false;

    public ClassC(ClassB view) {
        this.view = view;
    }
    public void setRunning(boolean run) {
          running = true;
    }
    @Override
    public void run() {
        while (running) {
           Canvas c;
           try {
               c = view.getHolder().lockCanvas();
               synchronized (view.getHolder()) {
                   view.onDraw(c);// Here I call onDraw to draw everything
               }
           } finally {
               if (c != null) {
                   view.getHolder().unlockCanvasAndPost(c);
               }
           }
        }
    }
}

在C类中,您不需要调用onDraw,它是由主活动调用的(如果不需要,则表示您做了一些错误的事情)。在主活动中启动逻辑线程。所以你得到了两个线程-绘制和逻辑。 如果您在ClassC中调用onDraw,然后编写ClassZ扩展线程,这将计算一些逻辑时刻。
在C语言中,你这样做是为了理解你所使用的线程。在Java中-one-Thread.run在forked-Thread中执行一项任务。

你是在问android中线程通常是如何工作的吗

在C++中,我假设你使用线程作为并行处理工具,将一个重复的工作负载加载到多个处理器上。p> 在Android中,除非您使用多核设备和Tegra平台等特定框架,否则这种线程处理实际上是浪费时间。在Android中,最好使用线程来执行您不想冒险在逻辑线程或UI线程上执行的任务

在您的例子中,我假设您正在使用android构建一个游戏,我建议您使用两个线程:一个逻辑线程和一个UI线程。让它们异步运行,你的游戏应该运行顺畅

对不起,我帮不了你,因为我不确定你的问题到底是什么

更多关于android线程的信息可以在这里找到