java语言中的线程

每一个java程序中都至少有一个线程。当java程序运行时,JVM就会创建主线程,并在该线程中调用程序的main()方法。线程可以理解为程序内部独立的运行单位。线程包括单线程模式和多线程模式,在单线程模式,只能一个方法调用执行完毕后,才会执行到下一个方法的调用,而多线程模式能够同时调用执行多个方法。

线程与进程的区别:一个应用程序就是一个进程,而线程是一个进程内部的多个运行单位。

线程的启动是通过调用线程的start()方法启动。
线程的运行是从线程的run()方法开始。

/*启动一个线程,能够添加多个小球,并且能够运行,
*小球之间能够相互碰撞,小球在窗体边缘能够反弹,
*能够暂停小球,和继续,还能够结束进程。
*/
package com.xiancheng071201;

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.awt.image.BufferedImage;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Game {

private JPanel centerPanel;
private Ball ba;
private ArrayList<Ball> al = new ArrayList<Ball>(); //创建队列对象

public void UI(){
JFrame jf = new JFrame("线程");

jf.setLayout(new BorderLayout()); //边框布局
JPanel jp=new JPanel(); //创建面板对象
jp.setPreferredSize(new Dimension(90, 0)); //给面板设置大小


jf.setSize(800, 500);

JButton jb = new JButton("添加小球"); //把按钮添加到面板上
jp.add(jb);
JButton jb1 = new JButton(" 暂 停 ");
jp.add(jb1);
JButton jb2 = new JButton("重新开始");
jp.add(jb2);
JButton jb3 = new JButton(" 结 束 ");
jp.add(jb3);

jp.setBackground(Color.BLUE); //给面板设置背景颜色
jf.add(jp, BorderLayout.WEST); //把面板添加到窗体上,并设置添加位置

centerPanel=new JPanel(); //设置中央面板
centerPanel.setBackground(new Color(235,235,235)); //给中央面板设置背景颜色

jf.add(centerPanel, BorderLayout.CENTER);//把中央面板添加到窗体上

jf.setDefaultCloseOperation(3); //关闭窗体时,程序退出
jf.setVisible(true); //把窗体显示出来

jb.addActionListener(l); //给按钮添加事件监听器
jb1.addActionListener(l);
jb2.addActionListener(l);
jb3.addActionListener(l);


Graphics g = centerPanel.getGraphics(); //创建中央面板画布对象

ImageIcon icon = new ImageIcon("beijing.jpg"); //创建图片对象
g.drawImage(icon.getImage(), 0, 0, null); //把图片画到中央面板上

while(true){
try {
Thread.sleep(30);
} catch (InterruptedException e) {

e.printStackTrace();
}
//创建内存存储画布对象
BufferedImage buffer = new BufferedImage(
centerPanel.getWidth(), centerPanel.getHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics g2 = buffer.getGraphics();
g2.drawImage(icon.getImage(),0, 0,
buffer.getWidth(),buffer.getHeight(),null);


for(int i = 0; i<al.size();i++){
Ball ba = al.get(i);
ba.Drawball(g2);
}
g.drawImage(buffer, 0, 0, null);

}


}
ActionListener l = new ActionListener() {


public void actionPerformed(ActionEvent e) {

String cmd = e.getActionCommand();

if(cmd.equals("添加小球")){
ba = new Ball(centerPanel,al);
al.add(ba);
ba.start();
}
if(cmd.equals(" 暂 停 ")){
for(int i=0;i<al.size();i++){
Ball ba = al.get(i);
ba.setPauseflag(true);
}
}
if(cmd.equals("重新开始")){
for(int i=0;i<al.size();i++){
Ball ba = al.get(i);
ba.setPauseflag(false);
}
}
if(cmd.equals(" 结 束 ")){
while(!al.isEmpty()){
Ball ba = al.remove(0);
ba.setStopflag(true);
}
// for(int i=0;i<al.size();i++){
// Ball ba = al.get(i);
// ba.setStopflag(true);
// }
}
}
};
public static void main(String[] args){
Game ga = new Game();
ga.UI();
}

}


package com.xiancheng071201;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JPanel;

public class Ball extends Thread{


private ArrayList<Ball> al;
private JPanel centerPanel;
private Graphics g;
private int x, y, oldx, oldy, radius, vx, vy, k,t,p;
private boolean pauseflag = false;
private boolean stopflag = false;
private int xx;
private int yy;


public Ball(JPanel centerPanel,ArrayList<Ball> al) {
this.centerPanel = centerPanel;
this.al = al;
init();
}

public void setPauseflag(boolean pauseflag) {
this.pauseflag = pauseflag;
}

public void setStopflag(boolean stopflag) {
this.stopflag = stopflag;
}

public void run(){
while(true){
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
g = centerPanel.getGraphics();
// g = (Graphics2D)gg;
// //设置抗锯齿效果
// g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
// RenderingHints.VALUE_ANTIALIAS_ON);

if(pauseflag){
continue;
}

// clearball();

rebound();

if(stopflag){
for(int i=0;i<al.size();i++){
Ball ba = al.get(i);
ba.clearball();
}
break;
}

// Drawball();
}
}
//初始化
public void init(){
Random r = new Random();
k = r.nextInt(4);
t = r.nextInt(4);
p = r.nextInt(4);
radius = r.nextInt(20)+20;
vx = r.nextInt(5)+2;
vy = r.nextInt(5)+2;
}


//反弹
public void rebound(){

oldx = x;
oldy = y;

x += vx;
crash(1);
y += vy;
crash(2);
if(x <= 0){
vx = Math.abs(vx);
}
if(x + radius >= centerPanel.getWidth()){
vx = -Math.abs(vx);
}
if(y <= 0){
vy = Math.abs(vy);
}
if(y + radius >= centerPanel.getHeight()){
vy = -Math.abs(vy);
}



}

//清除
public void clearball(){
for(int i=radius*2; i>0; i--){
g.setColor(centerPanel.getBackground());
g.fillOval(x-i/4, y-i/2, i, i);
}
}

//画球
public void Drawball(Graphics g){
for(int i=radius*2; i>0; i--){
Color c = new Color(255-i*k, 255-i*t, 255-i*p);
g.setColor(c);
g.fillOval(x-i/4, y-i/2, i, i);
}
}
//碰撞
public boolean crash(int direction){
for(int i=0;i<al.size();i++){
Ball ba = al.get(i);
if(ba == this){
continue;
}

xx = x + radius;
yy = y + radius;

//比较圆心的距离
int benx = Math.abs(ba.xx - this.xx);
int beny = Math.abs(ba.yy - this.yy);

int ben = (int) Math.sqrt(benx*benx + beny*beny);

if(ben <= ba.radius + this.radius){
System.out.println("碰撞了!!!!!");
if(direction == 1){
vx = -vx;
}
if(direction == 2){
vy = -vy;
}
x = oldx;
y = oldy;
}
}
return false;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值