你的这两句代码创建了一个线程并让它执行:
Thread t=new Thread(mp);
t.start();
当调用start()方法后,就会去执行对应线程类里的run()方法,这时候,run()方法和t.start()后面的语句一起执行。不过你的 MyPanel 虽然实现了Runnable接口,也可以开一个线程,但从你的代码上看,你没有用MyPanel 的对象对调用start()方法啊,你只调用了MyPanel的show()方法,这时那个线程根本不起作用。
Thread t=new Thread(mp);
t.start();
当调用start()方法后,就会去执行对应线程类里的run()方法,这时候,run()方法和t.start()后面的语句一起执行。不过你的 MyPanel 虽然实现了Runnable接口,也可以开一个线程,但从你的代码上看,你没有用MyPanel 的对象对调用start()方法啊,你只调用了MyPanel的show()方法,这时那个线程根本不起作用。
t.start();还是在主线程中运行的语句,t.start()这句的意思是启动t线程,当启动好了之后主线程继续沿t.start()后面执行
public class MyBall{
public static void main(String args[]){/**
这些代码是图形界面管理的。就不分析了。不是这个程序突出的重点。
*/
Frame w=new Frame();
w.setSize(300,400);
MyPanel mp=new MyPanel();
w.add(mp);
Thread t=new Thread(mp);
t.start();
w.show();
}
}
/**
以下代码是线程的创建线程有两种方式:第一种是继承Thread类。
第二种方式是:实现Runnable接口
重点给你讲第二种方式 的步骤吧:
1.创建一个类实现Runnable接口
2.实现run()方法。
3.创建实现Runnable接口的类的对象,
4.用实现Runnable接口的类的对象调用strat()方法
*/
class MyPanel extends Panel implements Runnable{
int x=30;
int y=30;
public void paint(Graphics g)
{
g.setColor(Color.white);
g.fillOval(x,y-1,50,50);
g.setColor(Color.black);
g.fillOval(x,y,50,50);}
public void run()//复写了run方法
{
while(true){
y++;
if(y>400){ //while循环,y在400以内一直y++
y=0;
}
//异常处理
try{
Thread.sleep(30);//线程停止30秒后在运行
}catch(Exception e){}
repaint();
}
}
}通俗点讲,线程跑起来得益于start方法,start方法的作用是开启线程,调用run方法。至于其他的你就别想了,什么线程控制两个代码呀,这些都是你考虑的太多了然后把自己给绕进去了。这个小程序的目的是想让你了解线程的使用。你就当他就是一个线程,通过变量y的变化控制着窗体变化。
t.start();还是在主线程中运行的语句,t.start()这句的意思是启动t线程,当启动好了之后主线程继续沿t.start()后面执行
意思是不是说在出现t.start();方法后,一方面程序继续向下执行,另一方面就要开始执行run(),当后面跟的程序执行完了之后是不是就剩下run()里面的方法在循环了?