`
fddong123456
  • 浏览: 6714 次
社区版块
存档分类
最新评论

java语言中的线程

    博客分类:
  • 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;
}
}
分享到:
评论

相关推荐

    浅析Java语言中线程的生命周期及实现方式.pdf

    浅析Java语言中线程的生命周期及实现方式.pdf

    Java多线程技术(实验)

    关于java多线程技术的实验 掌握java语言中的多线程编程技巧 掌握Thread类和Runnable接口 掌握java语言中多线程的生命周期 掌握java语言中线程的通信技巧

    Java语言多线程技术应用研究

    Java语言多线程技术应用研究 科技文写作

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    java线程第二版中英文 java线程第二版中英文 线程并不是新的概念:许多操作系统和语言都支持它们。在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却...

    Java语言多线程编程讲义

    Java语言多线程编程讲义

    多线程

    1. 理解Java语言中线程的基本概念; 2. 掌握Java语言中线程的两种编写方法; 二、实验内容 1. 编写一个Java程序,创建并运行三个线程: 1) 第一个线程打印a字母100次 2) 第二个线程打印b字母100次 3) 第三个线程...

    Java语言多线程技术及应用探讨

    Java语言多线程技术及应用探讨.kdh Java语言多线程技术及应用探讨.kdh

    完整版 Java高级教程 Java语言程序设计 第2章 Java多线程(共24页).ppt

    完整版 Java高级教程 Java语言程序设计 第2章 Java多线程(共24页).ppt 完整版 Java高级教程 Java语言程序设计 第2章 哲学家的故事(共7页).ppt 完整版 Java高级教程 Java语言程序设计 第3章 Java网络基础知识(共...

    java 程序多线程设计课件

    java多线程设计 java 程序多线程设计课件 java 程序多线程设计课件

    java线程 线程学习资料 java线程教程

    本教程适用于拥有丰富 Java 语言应用知识,但又没有多少多线程或并发性经验的Java 程序员。 学习完本教程之后,您应该可以编写一个使用线程的简单程序。您还应该可以阅读并理解以简单方 法使用线程的程序。

    Java语言中的线程同步互斥研究.pdf

    Java语言中的线程同步互斥研究

    java多线程模拟队列实现排队叫号

    java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号

    如何使用Java编写多线程程序

    线程的观念在java是语言中是重要的,根深蒂固的,因为在java语言中的线程系统是java语言自建的, java中有专门的支持多线程的API库,所以你可以以最快的速度写一个支持线程的程序。在使用java创建线程的时候,你可以...

    java多线程作业.docx

    Java语言的一大特性点就是内置对多线程的支持。多线程是指一个应用程 序中同时存在几个执行体,按几条不同的执行线索共同工作的情况,它使得编 微课视频 程人员可以很方便地开发出具有多线程功能、能同时处理多个任务...

    Java线程高清晰中文第二版

    Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件好事,因为如果没有线程,那么除了最简单的applet之外,几乎不可能编写出任何程序。如果你想使用Java,就必须学习线程。

    Java语言中的多线程编程.pdf

    Java语言中的多线程编程

    解析Java的多线程机制

    Unix操作系统环境下,应用程序可以利用fork... 可以说:Java语言对应用程序多线程能力的支持增强了Java作为网络程序设计语言的优势,为实现分布式应用系统中多客户端的并发访问以及提高服务器的响应效率奠定坚实基础。

    java时多线程钟源代码

    用java语言实现时钟程序,其中用到多线程、swing组件等

    Java多线程Executors批量执行数据实现限流

    Java多线程实现数据切割批量执行,实现限流操作。 java线程池Executors实现数据批量操作。 批量异步Executors处理数据,实现限流操作,QPS限流。 线程池调用第三方接口限流实现逻辑。 案例适合: 1.批量处理大数据。...

    java多线程编程教程

    Java线程是Java语言中一个非常重要的部分,Java5之前,多线程的语言支持还是比较弱的,内容也较少,写一个复杂的多线程程序是相当有挑战性的。 在Java5以后,Java对多线程做了很多扩展,扩展部分称之为并发包。这...

Global site tag (gtag.js) - Google Analytics