在corejava的课程中,有一个重要的知识点,就是线程。
那什么是线程呢?线程,是“进程”中某个单一顺序的控制流。而进程和流程的最大区别就在于,每个进程都会独享一块存储区域,多个线程只能共享此进程的这块存储区域。
那线程会给我们的java程序带来什么好处呢?好处一,可以实现并行,好处二,可以更有效的利用资源。
下面我们就编写一个小小的赛跑游戏来看看线程给我们程序带来的惊喜吧。
首先,咱们先看看程序最后完成的效果,及操作流程:
游戏一开始将直接进入主题,简洁的界面,无需说明文档,一眼便知如何操作。(见图1)
图1:游戏一开始的界面
选择好我们要支持的运动员后,点击确定按钮,此时游戏还没有开始,但我们已不可再改变支持的对象了。(见图2)
图2:下注后的界面
好吧,既然不能更改,那么就让比赛快点开始吧!“蜗牛,加油!加油!”(见图3)
图3:游戏开始后的界面
哦也!蜗牛赢了!看到了吗,结果就在图4里,哈哈哈,点击确定后,400分就拿到手了!
图4:出结果后的界面
真是一场痛快的比赛!
现在,咱们来进行一下赛后分析,上面这个小游戏究竟有多少个线程呢?我听到有人说“这个很容易就看出来了,一共就3个吗,每个参赛的跑者,都是一个线程”。真的只是表面看到的这样吗?
这个程序一共有5个线程!
不信吗?那听我来说说:第1个线程,就是被大家忽略了,却有非常熟悉的main。这个是我们java 程序运行时,必定会运行的,也是我们学习java时最早接触的一个线程。第2、3、4个线程,就是大家说的,那三个赛跑者,每一个都是一个独立的线程。第5个线程,从图上是看不到的,却又是一个非常重要的线程,它甘居幕后,担任着发令,裁决输赢的任务,我们暂且把它叫做“裁判”吧。
整个游戏的过程我们了解了,所包含的线程我们也都分析了,下面的时间就是着手实现的阶段了:
打着MVC的旗号,项目结构成了下面这个样子:
images:中放置着,程序所需要的全部图片
vo:里放着我们的一个实体类
enter:里存放着程序的入口
view:里存放着程序的界面
control里存放着“裁判”类和监听器。
界面部分的编写我就不细说了,就是要继承JFrame来定义我们自己的窗体。顺便说一句,那个跑道是通过画图绘制的背景。别忘了给按钮添加监听器哦!
今天的主题是线程,那么我们就要仔细看看线程的代码了:
java中实现线程的有两种途径,一种是继承Thread类,还有一种是实现Runnable接口。下面的关于 “运动员”、”裁判”的实现,我都统一使用了第二种方法,就是实现Runnable接口。具体代码如下:
package saipao.vo;
import java.awt.Image; import java.awt.Point; import java.util.Random;
import javax.swing.ImageIcon;
public class Runners implements Runnable{ private String name; //名称 private Point weiZhi;// 位置x和y的坐标 private ImageIcon imgBig; //大图片 private ImageIcon imgSmall; //小图标 private boolean flag; //是否被下注,初值为false private boolean win;//是否到达了终点 true为到达,false为没到达 private boolean isRun;//是否继续跑,true为继续,false为停止 /* * 名称、坐标、图片,小图标是只读的,只有get方法 * */
public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public String getName() { return name; } public Point getWeiZhi() { return weiZhi; } public ImageIcon getImgBig() { return imgBig; } public ImageIcon getImgSmall() { return imgSmall; }
public void setWin(boolean win) { this.win = win; }
public boolean isRun() { return isRun; } public void setRun(boolean isRun) { this.isRun = isRun; } public Runners(String name,int x,int y,String imageName) { super(); this.name = name; this.weiZhi=new Point(x, y); this.imgBig=new ImageIcon(this.getClass().getResource("/images/"+imageName+".gif")); this.imgSmall=new ImageIcon(this.getClass().getResource("/images/"+imageName+"1.GIF")); this.isRun=true; //默认为继续跑
}
//退到起点 public void fuWei(){ this.weiZhi.move(0, (int)this.weiZhi.getY()); this.flag=this.win=false; this.isRun=true; } //是否押对了 public boolean isWiner(){ return this.flag&this.win; } //重写Runnable接口中的Run方法,实现 x y坐标的改变
public void run() { Random rd=new Random(); //用于控制速度的随机数 while(this.isRun){ int x=(int)this.weiZhi.getX(); x+=rd.nextInt(10)+1; this.weiZhi.move(x,(int)this.weiZhi.getY()); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
}
} |
好了,运动员的代码我们看到了,你发现了Runnable接口中声明了几个方法了吗?答对了,就一个叫做Run的方法。当线程启动后,就将会执行Run方法中的代码。知道执行完毕退出run方法,此线程就死亡了。
光有运动员,没有裁判怎么行!
package saipao.control;
import java.util.Vector;
import javax.swing.JOptionPane;
import saipao.view.MainFrame; import saipao.vo.Runners;
/* * 裁判类,用来确定是否有到达终点的赛跑者 * */ public class CaiPan implements Runnable{ Vector<Runners> vt;// 运动员集合 int width;//终点线的位置 Thread [] thread; MainFrame mf; public CaiPan(MainFrame mf) { super(); this.vt = mf.getRnList(); this.width =mf.getZhongDianXian(); this.mf=mf; }
//运动员开始跑 private void startRun(){ thread=new Thread[vt.size()]; //给三个线程赋值并启动 for(int i=0;i<thread.length;i++){ thread[i]=new Thread(vt.get(i)); thread[i].start(); } }
//判断是否有人到达重点 public void run() { //调用开跑方法 this.startRun(); //判断是否有运动员到达终点 while(vt.get(0).isRun()){ mf.lblWeiZhi(); for(int i=0;i<vt.size();i++){ int x=(int)vt.get(i).getWeiZhi().getX();//得到运动员的x坐标 if(x>=this.width){ vt.get(i).setWin(true);//设置当前运动员赢了 //并通知所有运动员都不用再跑了 for(int j=0;j<vt.size();j++){ vt.get(j).setRun(false); } //退出判断是否到达终点的循环 break; } } } //赛跑结束,判断是输还是赢,并计算金额 boolean flag=false; for(int i=0;i<vt.size();i++){ if(vt.get(i).isWiner()){ flag=vt.get(i).isWiner(); break; } } if(flag){ JOptionPane.showMessageDialog(mf, "you win!");
}else{ JOptionPane.showMessageDialog(mf, "you lost!"); } mf.changeMoney(flag); mf.btnKongZhi(2, true); }
} |
有没有注意到,Runnable接口仅仅是提供了线程启动后要调用的功能(run),并没有提供启动线程的功能。要想真正的使线程运行起来,还是要通过Thread的帮助,因为Thread类中提供了启动线程的start()功能。
剩下的就是在对应的监听事件中,命令我们的裁判发号施令,开始我们的比赛了。
在和大家说byebye之前,还想请大家思考一下,运动员(Runners)那个类除了通过实现Runnable接口来编写线程程序,还有没有别的方式,使其成为线程?如果有,那么会不会影响我们其他类的代码呢?
立即动手吧!我会一直期待着你的答案哦!
相关推荐
这个"多线程赛跑小游戏"是一个很好的练手项目,可以帮助开发者理解并实践多线程的基本概念和操作。下面将详细介绍这个项目可能涉及的知识点。 首先,多线程是指在一个程序中同时执行多个独立的线程,每个线程都有...
简单Java多线程实例 游戏中已经定义好乌龟和兔子 玩家也可输入休息间隔和速度于乌龟和兔子比赛 加入了兔子速度随机化输出结果每一次都不一样 实现线程效果
在Java编程中,多线程是一项重要的技术,它允许程序同时执行多个...在实际开发中,多线程可以用于实现各种复杂的应用,如网络请求、定时任务、游戏逻辑等,而理解并熟练掌握多线程是成为一名优秀Java程序员的必备技能。
赛跑小游戏是一个很好的实例,用于理解和实践多线程的概念。在这个游戏中,每个参赛者(线程)代表一个独立的任务,它们并行运行,争夺比赛的胜利。下面我们将深入探讨Java线程的关键知识点以及如何在赛跑小游戏中...
总的来说,"赛跑游戏(Java)"是一个综合性的项目,涵盖了Java编程的基础知识,如面向对象编程、多线程、GUI设计和并发控制。通过这个游戏,开发者不仅展示了对Java语言的熟练掌握,还展现了对复杂问题的解决能力和...
#### 二、龟兔赛跑的多线程实现思路 在“龟兔赛跑”这一经典故事的基础上,本程序通过模拟兔子和乌龟的行为来展示多线程技术的应用。兔子和乌龟分别有自己的行为模式,并且这些行为的发生有一定的概率。 ##### 兔子...
本示例中的"Visual Studio 2008创建的龟兔赛跑动画多线程程序演示"是一个很好的教学实例,它结合了编程语言C#与微软的开发环境Visual Studio 2008,来展示如何利用多线程技术来实现动态的图形化应用程序。...
Java赛跑游戏是一款基于Java编程语言开发的教育性软件,主要目标是帮助学习者理解和掌握Java中的多线程技术。在这款游戏中,参赛者代表不同的线程,它们在同一场比赛中竞争,模拟了现实生活中的并发执行情况。通过...
Java多线程实现方块赛跑小游戏 本文主要介绍了使用Java多线程技术实现的方块赛跑小游戏,通过创建三个线程:ThreadA、ThreadB和ThreadFrame,分别负责控制方块A、方块B和游戏界面的更新。游戏的规则是两个方块从...
赛马游戏是一个很好的案例,可以用来展示如何利用多线程来模拟并发环境。在这个游戏中,每匹马都代表一个独立的线程,它们在同一赛道上竞速,最终决出胜负。 首先,让我们深入了解一下多线程的概念。在单线程环境中...
赛马游戏,基于多线程技术实现的龟兔赛跑模拟器,提供了丰富的自定义选项,如比赛时间、参赛马匹数量等。这样的程序设计旨在展示并发编程的应用,特别是线程间的协作与竞争,以及如何通过多线程来实现动态且实时的...
龟兔赛跑课设 本设计要求学生开发一个龟兔赛跑游戏,主要是对学生多线程编程、游戏方案设计、游戏背景及动漫制作等能力进行培养锻炼,同时还要求保证游戏有一个真实的操作界面和人性化操作设计。 此外,学生通过...
此外,"RTCRunGame"可能是包含这个多线程赛跑游戏完整实现的源代码文件。通过分析这个文件,我们可以更深入地学习如何在Java中有效地管理和控制多线程程序。 总之,"Java兔子乌龟公鸡赛跑"是一个生动的多线程教学...
赛跑游戏是一种常见的计算机程序,它通常包含多个虚拟角色在预设的赛道上进行比赛。在这个特定的案例中,游戏是用VC++6.0开发的,这是一个经典的Microsoft Visual C++版本,广泛用于Windows平台上的C++应用程序开发...
综上所述,“龟兔赛跑小程序”不仅仅是一个简单的赛跑游戏,它更是一个寓教于乐的教学平台。通过将抽象的编程概念融入到一个生动有趣的故事中,它使得学习线程控制和多线程编程变得更加直观和易于理解。对于那些希望...
在本项目中,"C#小程序-龟兔赛跑游戏"是一个编程教学示例,旨在帮助学生通过实际操作来理解C#编程语言的一些核心概念,尤其是涉及到图形界面和动画制作的部分。下面我们将深入探讨这个项目所涵盖的知识点。 首先,...
6. **多线程**:龟兔赛跑的动画可能涉及多线程处理,以确保UI的流畅性。主线程(UI线程)负责用户界面的更新,而动画的执行则可以在另一个线程中进行。 7. **SharedPreferences**:为了存储用户的状态(比如是否...
总的来说,这个JavaSwing龟兔赛跑项目展示了如何使用Swing构建GUI应用,以及如何结合多线程和事件处理实现游戏逻辑。同时,它还涉及到资源文件的管理和使用,这是开发任何GUI应用程序时都需要考虑的关键方面。通过...
在Java编程领域,"龟兔赛跑"是一个经典的示例,用于展示多线程和图形用户界面(GUI)的应用。这个程序模拟了寓言故事中的情节,即乌龟和兔子进行比赛,通过并发处理来同时运行两个角色的动作,使得它们在屏幕上能够...
此外,游戏还可能涉及到多线程、并发控制,尤其是在实时性要求高的游戏环境中。比如,用户界面的更新可能与游戏逻辑的执行在不同的线程中进行,以保证流畅性。 总的来说,蜗牛赛跑游戏的源文件类文件展示了面向对象...