Java线程游戏:多个小球在界面移动

本文介绍了线程的基本概念,强调了多线程在防止阻塞和提升效率上的优势,同时指出其可能导致的性能和内存问题。接着,展示了Java中实现线程的两种方式:继承Thread类和实现Runnable接口,并给出了启动线程的示例。最后,通过一个实际的多线程应用场景——多个小球在界面上移动的例子,详细解释了如何创建和启动线程,以及如何利用线程实现动态效果。
摘要由CSDN通过智能技术生成

一,线程

线程是系统对代码的执行进程,如果将系统当做一个员工,被安排执行某个任务的时候,他不会对任何其他的任务作出响应。只有当这个任务执行完毕,才可以重新给他分配任务。

多线程是指,将原本线性执行的任务分开成若干个子任务同步执行,这样做的优点是防止线程“堵塞”,增强用户体验和程序的效率。缺点是代码的复杂程度会大大提高,而且对于硬件的要求也相应地提高  

优点:

1、使用线程可以把占据时间长的程序中的任务放到后台去处理。

2、程序的运行速度可能加快。

缺点:

1、如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。

2、更多的线程需要更多的内存空间。

二,实现线程并启动线程

(1)单线程:main线程

public static void main(String[] args){
        int count=0;
        for(int i=0;i<10;i++){
            count++;
        }
        System.out.println("任务1执行完"+count);

        int count1=100;
        for(int i=100;i>10;i--){
            count--;
        }
        System.out.println("任务2执行完"+count1);
    }

(2)多线程实现

1,extends Thread类实现,重写run方法

public class ThreadDemo1 extends Thread{
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println("线程1执行中"+i);
        }
    }
}

2,implements Runnable 接口实现,重写run方法

public class RunnableDemo1 implements Runnable{
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println("线程2执行中"+i);
        }
    }
}

(3)线程启动

1,继承Thread类实现的线程类:创建线程类对象,调用start方法

2,实现Runnable接口实现的线程类:创建实现线程类的对象,将实现的线程类对象作为参数传到Thread构造方法创建对象,使用Thread对象调用start方法

public static void main(String[] args){
        ThreadDemo1 td1 = new ThreadDemo1();
        RunnableDemo1 rd1 = new RunnableDemo1();

        Thread t2 = new Thread(rd1);

        td1.start();
        t2.start();
    }

三,多个小球在界面移动

1,绘制界面

public class GameUI extends JFrame {
    public void initUI(){
        setTitle("线程游戏-v0.1");
        setSize(800,600);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

2,创建第一个小球

1)extends Thread类实现,重写run方法

2)为使小球可以动起来把坐标设成变量并放在循环里

3)通过g.fillOval(x,y,50,50);画出小球

4)sleep()控制小球的速度

public class Ball_1 extends Thread{
    int x,y;
    Graphics g;
    public Ball_1(JFrame jf){
        this.g = jf.getGraphics();
    }
    public void run(){
        for (int i=0;i<100;i++){
            try {
                Thread.sleep(60);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            g.fillOval(x,y,50,50);
            x++;
            y++;
        }
    }
}

3,创建第二个小球

1)extends Thread类实现,重写run方法

2)为使小球起始坐标随机化使用Random随机生成起始坐标

3)为使小球坐标移动随机化也使用Random随机生成坐标的移动速度

4)小球的颜色也通过Random进行了随机化

5)在有颜色的小球后面再画一个白色的小球来去除移动轨迹

6)对小球坐标范围进行限制,保证不会超出界面

7)去除循环条件使小球可以一直移动下去

8)sleep()控制小球的速度

public class Ball_2 extends Thread{
    int x1,y1;
    Graphics g;
    public Ball_2(JFrame jf){
        this.g = jf.getGraphics();
    }

    int speedx = -2;
    int speedy = -5;

    public void run(){
        Random ran = new Random();
        x1=ran.nextInt(800);
        y1=ran.nextInt(600);
        speedx = ran.nextInt(10)-5;
        speedy = ran.nextInt(10)-5;
        Color color = new Color(ran.nextInt(Integer.MAX_VALUE));
        for (int i=0; ;i++){
            g.setColor(color);
            g.fillOval(x1,y1,50,50);
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            g.setColor(Color.WHITE);
            g.fillOval(x1,y1,50,50);
            x1+=speedx;
            y1+=speedy;
            if(x1<=0 || x1>=720){
                speedx=-speedx;
            }
            if(y1<=0 || y1>=520){
                speedy=-speedy;
            }

        }
    }
}

4,启动线程

1)将创建对象移动到画图的外面,保证小球个数不变

2)对第二个小球套个循环可实现多个线程启动

3)继承Thread类实现的线程类:创建线程类对象,调用start方法启动线程

public class GameUI extends JFrame {
    public void initUI(){
        setTitle("线程游戏-v0.1");
        setSize(800,600);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        ball1 = new Ball_1(this);
        ball1.start();
        for(int i=0;i<10;i++){
            ball2 = new Ball_2(this);
            ball2.start();
        }
    }

    Ball_1 ball1;
    Ball_2 ball2;

    public void paint(Graphics g){
        super.paint(g);

    }

    public static void main(String[] args){
        new GameUI().initUI();
    }
}

5,运行效果

四,完整代码

1,GameUI

package SmallBall;

import javax.swing.*;
import java.awt.*;

public class GameUI extends JFrame {
    public void initUI(){
        setTitle("线程游戏-v0.1");
        setSize(800,600);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        ball1 = new Ball_1(this);
        ball1.start();
        for(int i=0;i<10;i++){
            ball2 = new Ball_2(this);
            ball2.start();
        }
    }

    Ball_1 ball1;
    Ball_2 ball2;

    public void paint(Graphics g){
        super.paint(g);

    }

    public static void main(String[] args){
        new GameUI().initUI();
    }
}

2,Ball_1

package SmallBall;

import javax.swing.*;
import java.awt.*;

public class Ball_1 extends Thread{
    int x,y;
    Graphics g;
    public Ball_1(JFrame jf){
        this.g = jf.getGraphics();
    }
    public void run(){
        for (int i=0;i<100;i++){
            try {
                Thread.sleep(60);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            g.fillOval(x,y,50,50);
            x++;
            y++;
        }
    }
}

3,Ball_2

package SmallBall;

import javax.swing.*;
import java.awt.*;
import java.util.Random;

public class Ball_2 extends Thread{
    int x1,y1;
    Graphics g;
    public Ball_2(JFrame jf){
        this.g = jf.getGraphics();
    }

    int speedx = -2;
    int speedy = -5;

    public void run(){
        Random ran = new Random();
        x1=ran.nextInt(800);
        y1=ran.nextInt(600);
        speedx = ran.nextInt(10)-5;
        speedy = ran.nextInt(10)-5;
        Color color = new Color(ran.nextInt(Integer.MAX_VALUE));
        for (int i=0; ;i++){
            g.setColor(color);
            g.fillOval(x1,y1,50,50);
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            g.setColor(Color.WHITE);
            g.fillOval(x1,y1,50,50);
            x1+=speedx;
            y1+=speedy;
            if(x1<=0 || x1>=720){
                speedx=-speedx;
            }
            if(y1<=0 || y1>=520){
                speedy=-speedy;
            }

        }
    }
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值