Java线程(实现多线程小球运动)
一、线程入门
- 进程:进行中的程序,操作系统分配资源的最小单位
- 线程:CPU调度的最小单位,线程属于某个进程
- 单线程:按照程序的顺序执行
- 多线程:能让进程同时执行多段程序
二、实现多线程小球
- Thread线程类
- Runnable接口:规定线程需要执行的内容
写一个界面,实现鼠标点击一下,出现一个小球,同时小球向右移动,再点击一下鼠标,又出现一个小球,同时小球向右移动…
第一步,先写一个窗体界面
public void initUI() { JFrame jf = new JFrame(); jf.setTitle("BallGame"); jf.setSize(800, 600); jf.setLocationRelativeTo(null); jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE); jf.setBackground(Color.WHITE); jf.setVisible(true); jf.getContentPane().setVisible(false); Graphics g =jf.getGraphics(); MyListener ml = new MyListener(g,x,y,m,n); jf.addMouseListener(ml); }
第二步,写了一个MyBall类,用来实现小球的绘制和移动
move方法,其中x,y是小球坐标,初始值由鼠标点击获取,之后会随着小球的运动而发生改变。当小球运动到窗体边界时,就会调转方向,继续移动。
public void move() { x += m; y += n; if(x > 740) { m = -m; } if(x < 0) { m = -m; } if(y > 540) { n = -n; } if(y < 0) { n = -n; } }
m,n代表小球在左右方向上移动的速度,为了让小球的运动具有随机性,我定义了一个随机数,来确定小球移动的方向,向右,向下或者斜向下。(这里关于方向还可以有更多的设计,这里我就简单定义了一下)
Random r = new Random(); int num = r.nextInt(3); switch(num) { case 0: m = 0; n = 2; break; case 1: m = 0; n = 2; break; case 2: m = 2; n = 2; break; }
ball_move方法实现了小球的绘制与移动,首先,根据x,y坐标画一个小球出来,等待100ms,在同一位置画一个与背景色一致的的圆,接着,小球坐标x,y发生改变,继续画圆、覆盖,这样连续下来,我们看到的就是小球朝着某个方向移动。
public void ball_move() { while(true) { g.setColor(color); g.fillOval(x, y, 50, 50); try { Thread.sleep(100); } catch (InterruptedException e1) { e1.printStackTrace(); } g.setColor(Color.WHITE); g.fillOval(x, y, 50, 50); this.move(); } }
第三步,创建一个MyRunnable方法来实现Runnable接口中的run方法
这里就创建小球对象,让小球移动就可以了
public void run() { Random r = new Random(); int num = r.nextInt(3); switch(num) { case 0: m = 0; n = 2; break; case 1: m = 0; n = 2; break; case 2: m = 2; n = 2; break; } MyBall ball = new MyBall(x, y, m, n, g,color); ball.ball_move(); }
第四步,创建鼠标监听器,MyListener类
获取鼠标点击出的坐标,并在鼠标点击后,创建线程。
public void mouseClicked(MouseEvent e) { //获取坐标 x = e.getX(); y = e.getY(); //创建线程 Random r1 = new Random(); color = new Color(r1.nextInt(256), r1.nextInt(256), r1.nextInt(256)); MyRunnable mr = new MyRunnable(g, x, y, m, n, jf,color); Thread thread = new Thread(mr); thread.start(); }
这样一个简单的多线程小球就做好了
看一下效果
当界面中,小球的数量增多时,会发现一个问题,小球的颜色变得不稳定,同时还出现了残影,这个问题的产生是多线程应用的必然,我将在下一节来解释为什么会这样,同时用一个新的方法来实现小球运动的操作。
本文地址:https://blog.csdn.net/qq_43340300/article/details/108026874
上一篇: MySQL分区表的最佳实践指南
下一篇: mysql累加计算实现方法详解