JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型
前几天用多线程实现了创建小球并移动,想到大鱼吃小鱼,便突发奇想要写一个大球吃小球。首先第一步自然是先把界面弄好啦
public class BallUI extends JPanel { private ArrayList<Ball> li = new ArrayList<Ball>(); public static void main(String[] args) {
BallUI bu = new BallUI();
bu.UI();
} public void UI() {
JFrame jf = new JFrame();
jf.setLocationRelativeTo(null);
jf.setResizable(false);
jf.setSize(700, 700);
this.setSize(jf.getWidth(),jf.getHeight());
jf.setTitle("大球吃小球"); this.setPreferredSize(new Dimension(jf.getWidth(), jf.getHeight()));
jf.add(this); jf.setVisible(true);
} }
界面写好后想想要怎么做呢?既然是大球吃小球还利用线程,那肯定需要一个队列,然后呢?既然要队列,那队列里存什么?肯定存小球啊,那自然要创建一个小球类了,那小球有什么属性呢?坐标、移动速度、大小、颜色,除了这些在创建时还需不需要传些什么参数呢?既然传了颜色,那肯定需要画小球,我们在哪画?是调用方法还是在线程中获取小球属性然后画?我觉得调用方法会更好,所以我们要在这里传入一个画布。同样在后面我们还需要检测小球是否碰撞,因此我们还需要传入一个队列。下面便是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) { }
}
创建好小球类后,我们便需要线程来创建小球、改变小球,那这里也有一个问题,我们是用一个线程还是两个还是多个?这样看,如果只用一个线程,那么我们每次改变小球得在创建了一个小球后进行,如果小球数量少还没问题,但是当小球数量多了之后,每便利一次就会用上一段时间,那么肯定会有延时,所以我们需要把这里分成两个线程,一个线程创建小球,一个线程改变小球。这里其实就利用了生产者消费者模型: 生产者负责生产数据并存入缓冲区,消费者从缓冲区中取出数据并且处理并输出。
public class ThreadBall extends Thread { private ArrayList<Ball> li;
private JPanel jp;
private Graphics g; public ThreadBall(ArrayList<Ball> li,JPanel jp) {
this.li = li;
this.jp=jp;
} public void run() {
g=jp.getGraphics();
while(true) {
for(int i=0;i<li.size();i++) {
Ball ball=li.get(i);
ball.clear(g);
ball.crash(g);
ball.move();
ball.draw(g);
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} }
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();
那么,剩下的任务就是实现小球类中的方法了,就留给你们去实现了。
注:代码已上传至github:https://github.com/leo6033/Java_Project
JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型的更多相关文章
- Java多线程读取大文件
前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋 ...
- java——多线程知识点大总结
1:理解线程的概念之前,我们有必要先理解一下进程的概念 程序(Program)是为实现特定目标或解决特定问题而用计算机语言(比如Java语言)编写的命令序列的集合. 进程指一个程序的一次执行过程 ...
- java多线程制作计时器
基本思路: 在类中创建thread 供按钮监听器调用. 界面设计:
- Java多线程总结之线程安全队列Queue
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非 ...
- java多线程之队列
1.注:先不看阻塞与否,这ReentrantLock的使用方式就能说明这个类是线程安全类. 2.线程安全的类,BlockingQueue,ConcurrentLinkedQueue.这些都是线程安全的 ...
- java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现
java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了 wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样 ...
- Java多线程学习(一)
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非 ...
- 【java】Java多线程总结之线程安全队列Queue【转载】
原文地址:https://www.cnblogs.com/java-jun-world2099/articles/10165949.html ============================= ...
- java 多线程 19: ReentrantLock 与 Condition
ReentrantLock ReentrantLock,一个可重入的互斥锁,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大. Reentran ...
随机推荐
- python爬虫requests过程中添加headers
浏览器中打开页面,以edge为例,点击“查看源”或F12 第一步:点击上图中“网络”标签,然后刷新或载入页面 第二步:在右侧“标头”下方的“请求标头”中的所有信息都是headers内容,添加到requ ...
- CSS表格均匀边框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- iperf测试网络带宽
http://blog.chinaaet.com/telantan/p/30901 https://boke.wsfnk.com/archives/288.html https://www.ibm.c ...
- disabled属性对form表单向后台传值的影响
在form表单里,如果对input加入disabled="disabled"或disabled="true"等属性,form表单提交的时候,就不会传值到后台. ...
- 图的最短路径-----------SPFA算法详解(TjuOj2831_Wormholes)
这次整理了一下SPFA算法,首先相比Dijkstra算法,SPFA可以处理带有负权变的图.(个人认为原因是SPFA在进行松弛操作时可以对某一条边重复进行松弛,如果存在负权边,在多次松弛某边时可以更新该 ...
- 判断gps是否在国内
参考文章:[WP7]判断GPS坐标是否在中国 根据国家行政边界判定(光线投射算法) 按需求调整了原文中的部分边界值,测试几组边界附近内外坐标,结果较为准确. /** * 判断GPS坐标是否在多边形中 ...
- Centos6.5下rsync+inotify的配置详解
Centos 6.5配置rsync+inotify实现文件实时同步 1.安装rsync(两台机器执行相同的步骤) yum install gcc yum install rsyncd xinetd - ...
- pytorch之LSTM
from:http://pytorch-cn.readthedocs.io/zh/latest/package_references/torch-nn/#recurrent-layers class ...
- springcloud配置详解
Spring Boot的配置参考Spring Boot系列文章,这里只对Spring Cloud用到的配置解释. spring.application.name:配置应用名称,在注册中心中显示的服务注 ...
- jQuery-属性操着
jquery属性操作分为属性操作,CSS类操作,HTML代码/文本/值操作 一:属性 使用 说明 例子 attr(name|pro|key,val|fn) 设置或返回被选元素的属性值, # 专门用于做 ...