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();
	}

这样一个简单的多线程小球就做好了
看一下效果

当界面中,小球的数量增多时,会发现一个问题,小球的颜色变得不稳定,同时还出现了残影,这个问题的产生是多线程应用的必然,我将在下一节来解释为什么会这样,同时用一个新的方法来实现小球运动的操作。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值