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