JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型

/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 [email protected]*/

前几天用多线程实现了创建小球并移动,想到大鱼吃小鱼,便突发奇想要写一个大球吃小球。首先第一步自然是先把界面弄好啦

 1 public class BallUI extends JPanel {
 2
 3     private ArrayList<Ball> li = new ArrayList<Ball>();
 4
 5     public static void main(String[] args) {
 6         BallUI bu = new BallUI();
 7         bu.UI();
 8     }
 9
10     public void UI() {
11         JFrame jf = new JFrame();
12         jf.setLocationRelativeTo(null);
13         jf.setResizable(false);
14         jf.setSize(700, 700);
15         this.setSize(jf.getWidth(),jf.getHeight());
16         jf.setTitle("大球吃小球");
17
18         this.setPreferredSize(new Dimension(jf.getWidth(), jf.getHeight()));
19         jf.add(this);
20
21
22
23         jf.setVisible(true);
24     }
25
26
27 }

界面写好后想想要怎么做呢?既然是大球吃小球还利用线程,那肯定需要一个队列,然后呢?既然要队列,那队列里存什么?肯定存小球啊,那自然要创建一个小球类了,那小球有什么属性呢?坐标、移动速度、大小、颜色,除了这些在创建时还需不需要传些什么参数呢?既然传了颜色,那肯定需要画小球,我们在哪画?是调用方法还是在线程中获取小球属性然后画?我觉得调用方法会更好,所以我们要在这里传入一个画布。同样在后面我们还需要检测小球是否碰撞,因此我们还需要传入一个队列。下面便是Ball类的构造了

public class Ball {
    private int size;
    private int x;
    private int y;
    private int speedX;
    private int speedY;
    private Color c;
    private JPanel jf;
    private ArrayList<Ball> li;

    public Ball(int size, int x, int y, int speedX, int speedY, Color c, JPanel jf, ArrayList<Ball> li) {
        this.size = size;
        this.x = x;
        this.y = y;
        this.speedX = speedX;
        this.speedY = speedY;
        this.c = c;
        this.jf = jf;
        this.li = li;
    }
  //画球
    public void draw(Graphics g) {
    }
  //移动球
    public void move() {
    }
  //清除上次留下的痕迹
    public void clear(Graphics g) {
    }
  //碰撞检测
    public void crash(Graphics g) {

    }
}

创建好小球类后,我们便需要线程来创建小球、改变小球,那这里也有一个问题,我们是用一个线程还是两个还是多个?这样看,如果只用一个线程,那么我们每次改变小球得在创建了一个小球后进行,如果小球数量少还没问题,但是当小球数量多了之后,每便利一次就会用上一段时间,那么肯定会有延时,所以我们需要把这里分成两个线程,一个线程创建小球,一个线程改变小球。这里其实就利用了生产者消费者模型: 生产者负责生产数据并存入缓冲区,消费者从缓冲区中取出数据并且处理并输出。

 1 public class ThreadBall extends Thread {
 2
 3     private ArrayList<Ball> li;
 4     private JPanel jp;
 5     private Graphics g;
 6
 7     public ThreadBall(ArrayList<Ball> li,JPanel jp) {
 8         this.li = li;
 9         this.jp=jp;
10     }
11
12     public void run() {
13         g=jp.getGraphics();
14         while(true) {
15             for(int i=0;i<li.size();i++) {
16                 Ball ball=li.get(i);
17                 ball.clear(g);
18                 ball.crash(g);
19                 ball.move();
20                 ball.draw(g);
21             }
22             try {
23                 Thread.sleep(100);
24             } catch (InterruptedException e) {
25                 e.printStackTrace();
26             }
27         }
28     }
29
30 }
public class BallLis extends Thread {
    private ArrayList<Ball> li = new ArrayList<Ball>();
    private JPanel jp;

    public BallLis(ArrayList<Ball> li,JPanel jp) {
        this.li = li;
        this.jp = jp;
    }

    public void run() {
        while (true) {
            int size = new Random().nextInt(30) + 10;
            int x = new Random().nextInt(jp.getWidth());
            int y = 0;
            int speedX = new Random().nextInt(10) + 10;
            int speedY = new Random().nextInt(10) + 5;
            Color c=new Color(new Random().nextInt(256),new Random().nextInt(256),new Random().nextInt(256));

            Ball bl=new Ball(size,x,y,speedX,speedY,c,jp,li);
            li.add(bl);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

}

创建好线程后肯定需要在BallUI类中创建对象啦

        BallLis ball = new BallLis(li,this);
        ball.start();
        ThreadBall tb=new ThreadBall(li,this);
        tb.start();

那么,剩下的任务就是实现小球类中的方法了,就留给你们去实现了。

原文地址:https://www.cnblogs.com/csu-lmw/p/9314532.html

时间: 2024-11-09 01:11:32

JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型的相关文章

【JAVA】wait和notify用法,附生产/消费模型

关于wait和notify的用法,网上已经有很多详细解释了,我只是简单的总结下. wait用于释放锁A,并让wait所在的线程阻塞.除非被持有锁A的其它线程执行notify来唤醒,它才能重新"活"过来. notify用于唤醒因为等待锁A而阻塞的线程,让它们做好竞争锁A的准备.如果有多个线程因等待锁A而被阻塞,notify只唤醒一个,唤醒所有用notifyAll. 参考下面的线程状态图,对理解wait和notify有很大的帮助. 总结: wait和notify通常和synchronize

Java生产消费模型—ArrayBlockingQueue详解

背景需求 生产消费模型是线程协作关系中十分常见的一种.通常,一个(多个)线程负责生产,一个(多个)线程可以从生产的列表中获取并消费:生产的内容可以按需求设计,可以是一个Integer,可以是String,可以Object,也可以是任意类型的对象,只要有生产消费的需求. 例如,厨师负责生产美食,放在桌子上,服务员负责取走(消费)美食.这里,厨师就扮演着生产者的身份,美食是生产的内容,服务员就扮演着消费者的身份. 下面用这个厨师与服务员的案例来分析下生产消费模型需要实现哪些功能才能满足需求: 如何实

Java多线程读取大文件

前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋友跟我聊起,他说有个需求,需要把上G的txt文件读取写入到数据库.用普通的io结果自然是OOM了,所以果断用NIO技术.为了提高速度,自然还得用上多线程技术. 接下来就介绍一下实现思路以及相关的知识点. 内容 一.对文件分区 为了充分利用多线程读取,就需要把文件划分成多个区域,供每个线程读取.那么就

java多线程制作计时器

基本思路: 在类中创建thread 供按钮监听器调用. 界面设计: 代码: 1 package thread; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 import javax.swing.*; 7 8 public class Threadtest extends JFrame implements Runnable{ 9 JFrame frm=new JFrame("watch"); 10 JPanel botto

Java多线程总结之线程安全队列Queue

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列. 注:什么叫线程安全?这个首先要明确.线程安全的类 ,指的是类内共享的全局变量的访问必须保证是不受多线程形式影响的.如果由于多线程的访问(比如修改.遍历.查看)而使这些变量结构被破坏

Java多线程之线程安全队列Queue

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列. 注:什么叫线程安全?这个首先要明确.线程安全的类 ,指的是类内共享的全局变量的访问必须保证是不受多线程形式影响的.如果由于多线程的访问(比如修改.遍历.查看)而使这些变量结构被破坏

Java 多线程系列2——多线程的生命周期及生产消费者模型

一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了.主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态.处于就绪状态的线程,只是说

java多线程之队列

1.注:先不看阻塞与否,这ReentrantLock的使用方式就能说明这个类是线程安全类. 2.线程安全的类,BlockingQueue,ConcurrentLinkedQueue.这些都是线程安全的集合类 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选

java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了  wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样,先定义一个缓冲区: public class ValueObject { public static String value = ""; } 换种写法,生产和消费方法放在一个类里面: public class ThreadDomain41 extends ReentrantLock {