小球碰撞“因为有你,所以不孤单”——多线程_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 小球碰撞“因为有你,所以不孤单”——多线程

小球碰撞“因为有你,所以不孤单”——多线程

 2013/8/8 1:08:15  guanxianxiao  程序员俱乐部  我要评论(0)
  • 摘要:线程:在接触之前一直觉得线程是很高端的,学了线程就会有质的飞跃,我们就可以从只能写出简单的界面什么滴,到可以做一些小游戏,坦克大战、弹球···。但当接触学习后,发现其实也就是几行代码的问题,并没有当初接触前想的那么神乎其神。线程可以理解为“程序内部一个独立的运行单位”。每个java程序至少都至少有一个线程-主程序。每个独立运行的对象都可以看做是一个线程,坦克大战中的各个坦克、弹球中的各个小球、雷电中的各个飞机····都可以理解是一个线程。单线程:publicvoidma(){mb();md()
  • 标签:多线程 线程
线程:在接触之前一直觉得线程是很高端的,学了线程就会有质的飞跃,我们就可以从只能写出简单的界面什么滴,到可以做一些小游戏,坦克大战、弹球···。但当接触学习后,发现其实也就是几行代码的问题,并没有当初接触前想的那么神乎其神。
        线程可以理解为“程序内部一个独立的运行单位”。每个java程序至少都至少有一个线程-主程序。
        每个独立运行的对象都可以看做是一个线程,坦克大战中的各个坦克、弹球中的各个小球、雷电中的各个飞机····都可以理解是一个线程。
       
单线程:
public void ma(){
mb();
md();
}
public void mb(){
mc();
}
public void mc(){
}
public void md(){
}
这种模型的特点是:只有当mb执行完毕后,ma才会返回,只有当mc执行完毕后,mb才可能完
成;在ma()调用中,只有当mb()执行完毕后,才会执行到md(),这是顺序的调用模型,我们
称之为单线程模型


多线程:
多线程模型就是将代码的调用放到一个独立的运行单元-线程中,让多个调用并执行。

多线程的实现:关键字 Thread  start()
每个线程对象都是继承java.unit.Thread类的对象或implements了java.unit.Runnable
接口类的对象,线程的启动是通过调用线程对象的start()方法启动,线程的运行是
从线程对象的run方法开始,的那个线程对象的run()方法结束后线程结束。

继承Thread类实现线程

public calss 类名 extends Thread{//继承Thread类
//线程执行入口,调用线程对象的start()方法后,线程就从它的run方法开始独立执行
public void run(){
//线程中具体要实现的功能 
code····
}
}

//在主函数中实例化对象并调用其start()方法
类名 对象名  = new 对象名();
对象名.start();//开启线程

实例:
小球碰撞

小球类:
class="java" name="code">

public class Ball extends Thread{
	
	public Ball(JPanel jp,Ball[] ball,int count){
		this.jp = jp;
		this.ball_1=ball;
		this.count=count;
		System.out.println("加一个圆"+count);
	}

	public void run(){
	
		g = jp.getGraphics();
		Random ran = new Random();
		int x =ran.nextInt(300)+50;
		int y = ran.nextInt(300)+50;
		int width=ran.nextInt(20)+30;
		int height=width;

		
		System.out.println("初始位置为"+x+"\t"+y);
		
		xspeed = ran.nextInt(10)+1;
		yspeed = ran.nextInt(10)+1;
		xspeed =1;
		yspeed =1;	
		int i =ran.nextInt(7);
		Color []color ={Color.BLUE,Color.lightGray,Color.GREEN,Color.ORANGE,Color.PINK,Color.RED,Color.WHITE};
		while(true){
			System.out.println("开始运行"+count);
			if(x<0||x>400-width){
				xspeed=-xspeed;
			}
			if(y<0||y>400-height){
				yspeed=-yspeed;
			}
			
			g.setColor(Color.BLACK);
			g.fillOval(x, y, width, height);
			
			x+=xspeed;
			y+=yspeed;
			g.setColor(color[i]);
			
			xpoint=x+width/2;//圆心坐标
			ypoint=y+height/2;
			r= (width*Math.sqrt(2));//直径
			
			this.hit();
			
			g.fillOval(x, y, width, height);
			
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
}
	public void hit(){
		if(count>=2){
		for(int i=0;i<count;i++){
			if(ball_1[i]==this){
				continue ;
			}
			double length = Math.sqrt(Math.pow((ball_1[i].getX()-this.xpoint),2)+Math.pow((ball_1[i].getY()-this.ypoint),2));
			double l =( ball_1[i].getr()+this.r)/2;
			if(length<=l){
				int xspeed_temp,yspeed_temp;
				xspeed_temp=this.xspeed;
				yspeed_temp=this.yspeed;
				this.xspeed=ball_1[i].getxspeed();
				this.yspeed=ball_1[i].getyspeed();
				ball_1[i].setxspeed(xspeed_temp);
				ball_1[i].setyspeed(yspeed_temp);
			}
		}
		}
		
	}

	public double getX(){
		return xpoint;
	}

	public double getY(){
		return ypoint;
	}
	
	public double getr(){
		return r;
	}
	public int getcount(){
		return count;
	}
	public void setxspeed(int x){
		xspeed=x;
	}
	public void setyspeed(int y){
		yspeed=y;
	}
	public int getxspeed(){
		return xspeed;
	}
	public int getyspeed(){
		return yspeed;
	}
	
	Graphics g;
	private JPanel jp;
	private double xpoint,ypoint;
	private double r;
	private int xspeed,yspeed;
	private int count;
	private Ball[] ball_1 = new Ball [10];
}


主函数:


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BallBoard extends JPanel {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		 BallBoard  bb = new BallBoard ();
		bb.initUI();
		}

	private void initUI() {
		JFrame  jf = new JFrame();
		jf.setTitle("小球移动");
		jf.setResizable(false);
		jf.setDefaultCloseOperation(3);
		jf.setLocationRelativeTo(null);
		jf.setSize(400, 450);
		
		jp = new JPanel();
		
		jp.setPreferredSize(new Dimension(400,400));
		jp.setBackground(Color.BLACK);
		jf.add(jp,BorderLayout.CENTER);
		
		JPanel jp1 = new JPanel();
		jp1.setPreferredSize(new Dimension(400,40));
		
		JButton jb1 = new JButton("Add");
		jb1.setPreferredSize(new Dimension(80,30));
		
		ActionListener al = new ActionListener(){

			public void actionPerformed(ActionEvent e) {
				String jb1 = e.getActionCommand();
				if(jb1.equals("Add")){
					count++;
					Ball ball = new Ball(jp,ball_1,count);
					ball_1[ball.getcount()-1]=ball;
					ball.start();
					
				}
			}
			
		};
		jb1.addActionListener(al);
		
		jp1.add(jb1);
		jf.add(jp1,BorderLayout.SOUTH);
		
		jf.setVisible(true);
	}
	
	 JPanel jp;
	 Ball[] ball_1 =new Ball[10];
	 private int count=0;

}
发表评论
用户名: 匿名