小球碰撞“由于有你,所以不孤单”——多线程
小球碰撞“因为有你,所以不孤单”——多线程
线程:在接触之前一直觉得线程是很高端的,学了线程就会有质的飞跃,我们就可以从只能写出简单的界面什么滴,到可以做一些小游戏,坦克大战、弹球···。但当接触学习后,发现其实也就是几行代码的问题,并没有当初接触前想的那么神乎其神。
线程可以理解为“程序内部一个独立的运行单位”。每个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();//开启线程
实例:
小球碰撞
小球类:
主函数:
线程:在接触之前一直觉得线程是很高端的,学了线程就会有质的飞跃,我们就可以从只能写出简单的界面什么滴,到可以做一些小游戏,坦克大战、弹球···。但当接触学习后,发现其实也就是几行代码的问题,并没有当初接触前想的那么神乎其神。
线程可以理解为“程序内部一个独立的运行单位”。每个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();//开启线程
实例:
小球碰撞
小球类:
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; }