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 ...
随机推荐
- 2019.3.16 noiac的原题模拟赛
RT,这太谔谔了,我不承认这是模拟赛 但是虽然是搬了三道题,题目本身也还能看,就这么着吧 (怎么机房里就我一道原题都没做过啊 T1 CF24D Broken Robot 比较简单地列出式子之后,我们发 ...
- 20145215卢肖明《网络对抗》逆向及Bof基础
20145215卢肖明<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...
- 数据量越发庞大怎么办?新一代数据处理利器Greenplum来助攻
作者:李树桓 个推数据研发工程师 前言:近年来,互联网的快速发展积累了海量大数据,而在这些大数据的处理上,不同技术栈所具备的性能也有所不同,如何快速有效地处理这些庞大的数据仓,成为很多运营者为之苦恼的 ...
- linux command ------ netstat
netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的状态信息. 语法选项 netstat [选项] -a或--all:显示所有连线中的 ...
- python数据分析美国大选项目实战(三)
项目介绍 项目地址:https://www.kaggle.com/fivethirtyeight/2016-election-polls 包含了2015年11月至2016年11月期间对于2016美国大 ...
- Java基础-SSM之mybatis的树形控件(自关联)
Java基础-SSM之mybatis的树形控件(自关联) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建areas表: use y ...
- [转载]Markdown——入门指南
http://www.jianshu.com/p/1e402922ee32/ 转载请注明原作者,如果你觉得这篇文章对你有帮助或启发,也可以来请我喝咖啡. 导语: Markdown 是一种轻量级的「标记 ...
- 【ORACLE】创建表空间
CREATE TABLESPACE dna36 DATAFILE 'D:\oracle\oradata\orcl\dna36.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M ...
- oracle 级联查询 根路径
级联查询有很多教程示例,但是没有找到求特定子孙到根的路径的例子,折腾了一番总算想出方法了. 现假设我们拥有一个菜单表t_menu,其中只有三个字段:id.name和parent_id.它们是具有父子关 ...
- 纠正几个NANDFLASH很容易犯的错误【转】
转自:https://blog.csdn.net/pengrui18/article/details/32337297 今天在看别人如何根据物理地址计算NANDFLASH的列地址(column add ...