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