多线程练习(4个从对角出发并弹回的小球)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 多线程练习(4个从对角出发并弹回的小球)

多线程练习(4个从对角出发并弹回的小球)

 2013/7/14 15:16:18  IRISL  程序员俱乐部  我要评论(0)
  • 摘要:1.定义和基本写法:定义:在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。线程类的写法:publicclassNameextendsThread(){//重新其中的RUN方法publicvoidrun(){a();}}创建线程对象的写法:Namethreadpt=newNamethread()
  • 标签:多线程 线程
1.定义和基本写法:
定义:
在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。

线程类的写法:
public class Name extends Thread(){
    //重新其中的RUN方法
    public void run(){
      a();
    }
  }

创建线程对象的写法:
    Namethread pt=new Namethread();
启动线程对象:
     pt.start();
注意:一个线程对象只能启动一次,否则会报错。
线程中的操作都可执行,但顺序不可控。

2.基本思路和源代码:

示例程序:4个从对角出发并弹回的小球

基本思路:给显示框加一个按钮(加在一个JPanel上,格式默认为流式),再给按钮加一个监听器。在监听器中创建并开启4个线程。线程中有4个函数,各用来画4个方向的小球。基本相同,只有坐标的计算方式不同。开一个比较大的循环,不断地画圆,记录下每一个圆的位置,在画新的圆之前擦去旧的。(清除函数:a.clearrect)并且控制色彩,使它渐变。

程序代码:


主函数:
import java.awt.Dimension;
import java.awt.Graphics;


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





public class ball extends JFrame{
    boolean go=true;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
        ball b=new ball();
        b.InitGUI();
}

private void InitGUI() {
// TODO Auto-generated method stub
this.setTitle("球");
this.setSize(new Dimension(600,600));
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setResizable(false);
this.setVisible(true);
Graphics g=this.getGraphics();
JPanel JP=new JPanel();
JButton BU=new JButton("PUSH");
this.add(JP);
JP.add(BU);

BUAction l=new BUAction(g);
BU.addActionListener(l);
}

}
监听器BUAction:


import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class BUAction implements ActionListener{
    private Graphics g;
    public BUAction(Graphics g){
    this.g=g;
    }
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Printthred p1=new Printthred(g,1);
p1.start();
Printthred p2=new Printthred(g,2);
p2.start();
Printthred p3=new Printthred(g,3);
p3.start();
Printthred p4=new Printthred(g,4);
p4.start();
}

}
线程类Printthred:


import java.awt.Color;
import java.awt.Graphics;

public class Printthred extends Thread{
int ii=0,jj=0,c1=0,c2=0,c3=0,c4=0;
private Graphics g;
private int type;
    public Printthred(Graphics g,int type){
    this.g=g;
    this.type=type;
    }
public void run(){
    if(type==1)draw1();
    if(type==2)draw2();
    if(type==3)draw3();
    if(type==4)draw4();
    }
    public void draw1(){
    for (int i=0;i<1000;i++){
    c1=c1+1;
    g.setColor(new Color((100),(200),(c1)%256));
    if(i>=300){
       g.clearRect(300-(ii-300),300-(ii-300), 30, 30);
           g.fillOval(300-(i-300), 300-(i-300), 30, 30);
          
    }else
       { g.clearRect(ii, jj, 30, 30);
    g.fillOval(i, i, 30, 30);
     
       }
    try{
         Thread.sleep(10);
      }catch(Exception ef){}
      ii=i;jj=i;
    }
    }
    public void draw2(){
    for (int i=0;i<1000;i++){
    c2=c2+1;
    g.setColor(new Color((100),(200),(c2)%256));
    if(i>=300){
       g.clearRect(ii,300-(ii-300), 30, 30);
//       g.setColor(Color.white);
//       g.fillRect(ii,300-(ii-300), 30, 30);
           g.fillOval(i, 300-(i-300), 30, 30);
          
    }else
       { g.clearRect(ii, 600-jj, 30, 30);
    g.fillOval(i, 600-i, 30, 30);
     
       }
    try{
         Thread.sleep(10);
      }catch(Exception ef){}
      ii=i;jj=i;
    }
    }
    public void draw3(){
    for (int i=0;i<1000;i++){
    c3=c3+1;
    g.setColor(new Color((250),(c3)%256,(250)));
    if(i>=300){
       g.clearRect(300-(ii-300),ii, 30, 30);
           g.fillOval(300-(i-300), i, 30, 30);
          
    }else
       { g.clearRect(600-ii, jj, 30, 30);
    g.fillOval(600-i, i, 30, 30);
     
       }
    try{
         Thread.sleep(10);
      }catch(Exception ef){}
      ii=i;jj=i;
    }
    }
    public void draw4(){
    for (int i=0;i<1000;i++){
    c4=c4+1;
    g.setColor(new Color((250),(c4)%256,(250)));
    if(i>=300){
       g.clearRect(ii,ii, 30, 30);
           g.fillOval(i,i, 30, 30);
          
    }else
       { g.clearRect(600-ii,600-jj, 30, 30);
    g.fillOval(600-i, 600-i, 30, 30);
     
       }
    try{
         Thread.sleep(10);
      }catch(Exception ef){}
      ii=i;jj=i;
    }
    }
}

其他练习:跳动的图形。
基本思路:
把圆换成图片:
加图片方法示例:
ImageIcon pic=new ImageIcon("image/black.png");
Image img = pic.getImage();
g.drawImage(img, x,600-y,pic.getIconWidth(),pic.getIconHeigh(),null);
Y的坐标用SIN(X)算,并且扩大几倍。

源代码:


线程:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;

public class Printthred2 extends Thread{
int ii=0,jj=0,c1=0,j,x,y;
private Graphics g;
private int type;
    public Printthred2(Graphics g,int type){
    this.g=g;
    this.type=type;
    }
public void run(){
    if(type==1)draw1();
    }
    public void draw1(){
    for (int i=0;i<100;i++){
   
    c1=c1+1;
    g.setColor(new Color((100),(200),(c1)%256));
       x=x+i*2;
       y=(int)(Math.sin(x)*200);
       ImageIcon pic=new ImageIcon("image/black.png");
       Image img = pic.getImage();
       g.drawImage(img, x,600-y,pic.getIconWidth(),pic.getIconHeight(),null);
       g.clearRect(ii,600-jj,pic.getIconWidth(),pic.getIconHeight());

       try{
         Thread.sleep(100);
      }catch(Exception ef){}
      ii=x;jj=y;
    }
    }

}

画图形的方法好麻烦啊……
  • 大小: 14.2 KB
  • try.jar (3.6 KB)
  • 下载次数: 0
  • 查看图片附件
发表评论
用户名: 匿名