为什么要用线程
在单线程程序中,当一个操作未完成时,必须等正在运行的操作完成后才能运行下一个,过于呆板。线程相当于单独开辟一小块地方让它跑,多个操作可同时运行。
关于线程的使用
1.创建一个线程类,继承父类Thread。
2.start方法
启动线程的方法:线程对象调用start方法。
3.run方法(线程启动时自动开始调用的方法)
执行步骤可改写在此方法中。
3.线程的休眠
在while循环中,不加休眠将看不到小球运动的痕迹
try(){
Thread.sleep(30);
}catch (Exception ef){}
注:会发现当休眠写在fou循环里面时,当队列中对象变多时会越来越慢。应将休眠写在for外面
队列在线程中的应用
最开始为一个小球占用一个线程,但是线程过多不利于
于是引入队列,将小球对象封装为一个类,将小球存入队列,将多线程又变为单线程。
1.将线程由原来的监听启动改为放到界面类中启动,此后将一直保持运行。
public void showUI() {
this.setSize(600, 800);
this.setTitle("PLANE");
this.setDefaultCloseOperation(3);
MyListener l=new MyListener(g,list);
this.addMouseListener(l);
this.setVisible(true);
g=this.getGraphics();
DrawThread dt=new DrawThread(g,list);
dt.start();
}
2.在主界面创建队列,通过构造器传到监听和线程类中
3.将获得的x,y坐标封装为fls对象并加入列表
public void mousePressed(MouseEvent e){
int X=e.getX();int Y=e.getY();
System.out.println("X="+X);
flys fls=new flys(X,Y);
list.add(fls);
}
4.遍历列表,在线程的run方法中画出来
public void run() {
while(true) {
System.out.println(list.size());
for(int i=0;i<list.size();i++) {
flys fls=list.get(i);
fls.X+=10;
fls.Y=fls.Y+(int)(40*Math.sin(fls.X));
g.fillOval(fls.X, fls.Y, 20, 20);
System.out.println("X="+fls.X);
System.out.println(" "+2*Math.sin(fls.X));
System.out.println("Y="+fls.Y);
}
try {
Thread.sleep(30);
}catch (Exception ef) {}
}
}