这次小编在这里给大家整理了飞机心得体会(共含10篇),供大家阅读参考。同时,但愿您也能像本文投稿人“mynice”一样,积极向本站投稿分享好文章。
这个暑假,爸爸妈妈带我去上海旅游。爸爸担心暑假期间机票紧张,所以早早的就买好了飞机票。不过,航班是十天以后的,对于我来说,就等着出行的那一天早点到来。可等待的日子很漫长,令我坐立不安。每天手里拿着爸爸买回的机票,不厌其烦的看了又看,MU5394,A320,从航班号到飞机机型,我没有放过机票上的任何一个数字和文字。可不是嘛,这看似不大的一张机票却承载着我多年的梦想。
在漫长的等待中,我终于迎来了喜圆我飞天梦的那一天。
7月21日,星期六。吃过早饭我们自己开着车早早的就来到了郑州新郑机场。在经过了严格的安检之后,我们排队依次来到了候机大厅,透过玻璃窗看着停在停机坪上的一架架大飞机,我雀跃不已,我不停的问妈妈哪一架是我们要坐的飞机。过了半个小时,喇叭里传出空姐甜美的声音,由于机场人流量太大,我们的航班延误了,要延迟一个小时才能到达郑州机场,我很失落,妈妈说好事多磨嘛,要有耐心,虽然很失落,可是也没有办法。
等到12:30我们的飞机最终缓缓落到了停机坪上。我驻足仰视了眼前的这架大飞机许久,却又在爸爸的催促下踏上了舷梯。没想到机舱里如此宽阔、整洁和明亮,漂亮的空姐始终面带微笑,真让人有种回到了家中的感觉。按照机票的座位安排,我“心有不甘”的落了座,好奇的眼睛依然不停地四处张望。
飞机起动了,只听见“轰、轰”的声音好像是有一只大手把我的耳朵捂住一样,非常难受。我问爸爸怎么了?爸爸说:“没什么,这是正常的.。”听了这句话,我就放心了。这时,空姐亲切的说:“乘客们,飞机马上就要起飞了,请您再次检查一下您的安全带有没有系好……”在一段助跑之后,突然有了一股头重脚轻的感觉,原来飞机正昂首飞向蓝天。
飞机起飞了。从身旁的一扇小窗俯视身下,原来的高楼大厦已经变成了小积木块一样,公路上的汽车俨然成了小蚂蚁,一块块整齐的田地,组成了一个个大大的“田”字,漂亮极了。这时,空姐推着小推车来到了我们身旁,各种饮品自由选择,我要了一杯纯净水,感觉比平时喝的水甜了很多,还隐隐的闻到了香味,这在以前是从没有过的,或许是第一次在飞机上喝的缘故吧。
爸爸说这次飞行要一个多小时,为了打发这段在空中的时间,我随手拿了飞机上的一本杂志看看,不知不觉睡着了。突然喇叭里又响起了声音:“飞机马上就要降落了,请您做好准备…”
终于到上海了,虽然飞机在空中陪伴了我一个多小时,但我还是对飞机有种依依不舍的感觉。是啊,我也能像小鸟一样过了把飞天梦想。
没过多久,飞机降落了。我们走出机场,向出站口走去……
小时候,爸爸曾答应在我10岁之前一定要带全家人到海南去玩儿一趟。可这话也说过去好几年了,眼看着我11岁的生日也步步临近。“还整天给我说人要重守承诺,到时看怎么给人家解释”我心中暗暗嘀咕。“到那天,我们将乘早7:30北京至海口的航班飞过去”!当爸爸告诉我1月30日将去海南旅游的消息时,我异常激动,按捺不住竟手舞足蹈欢呼雀跃起来。提前几天就把自己的衣物整理好,剩下的就是天天掰着指头盼望着1月30日的到来,同时还在想坐飞机到底是什么滋味呢?汽车、火车、轮船我都坐过,飞机也不会奇特到哪儿吧?
1月30日凌晨4点,我和爸爸妈妈就早早地起了床,手脚利索地洗漱完毕。5点多就出门儿了,北三环上车辆很少,我们乘的出租半个小时左右就到了首都机场3号航站楼。刚一迈进航站楼的大门,我就被大厅宏伟的气势震慑住了:机场的宽阔我早就有所耳闻,可没有想到竟是这般的壮观。整个大厅由上百根高大粗壮的柱子支撑着,柱与柱前后左右的距离不下五十米,我大张着嘴巴,一个航站楼的面积该有多大呀!
凌晨6点,机场大厅里早已熙熙攘攘人头攒动起来,人们分别在各个航空公司的柜台前办理登机前的手续。爸爸妈妈却带着我来到了登机自动受理电脑前,他们进行了一步步的操作后,电脑竟自动打印出了三张印有航班和个人信息的卡片,这就是所谓的登机牌呀!我定睛细看,上面写着班次、日期、座号、舱位、姓名、登机口、登机时间、离港机场、到港机场、电子票号……嗬!没想到一张小小的卡片包含了这么多信息,也许这就是人们所说的小物有大用吧!下一项手续就该办行李托运了,国航工作人员打印出了两张印有相同编号的卡片,一张贴在行李上,另一张交给了我们。我们离开了,可怜的行李却被一条传送带给带走了。登机前最复杂的手续莫过于安检了,人们要把随身携带的钱包、手机、手提袋、钥匙等物放到传送带上的一个塑料筐里通过安检。人们则通过一个设有电子检测系统的门后由工作人员进行检查。通过安检门的时候,你身上的任何一个金属物件都会引起系统的注意,比如扣子、拉链之类的物品。于是,你的全身上下便会被一根近似于椭圆形,像棒锤一样的东西扫一遍,然后才能放行。
通过这些手续,终于来到了候机室。我向窗外眺望,看到停机坪上停着好多架飞机,它们可比我的玩具飞机大多了!想到自己一会儿就要坐在这个庞然大物的“肚子”里,我感到全身的血都在往头上涌,高兴得不得了。凌晨7点,当显示屏上显示我们乘坐的航班开始登机时,我兴奋地一下子从椅子上跳了起来。检过机票,我一溜烟儿冲进了登机门,来回拐了几个弯儿后,我终于踏在了飞机坚实的身体上。我们乘坐的是波音777飞机,里面有两个走道,九列座位,让人一点儿都不觉得压抑。爸爸说我第一次坐飞机,就把靠舷窗的位置让给了我。坐下后扣好安全带,闭上眼睛竟觉得像坐在自己家里的沙发上一样舒服!我开始检查起我位置上配备的东西:一副耳机、一条毛毯、一本杂志和一个靠垫,前面还有一个可收起放下的小桌板。飞机上还有好多台电视,通过屏幕空姐正在给乘客做着遇到紧急情况时应对的方法。不知怎么此时我的内心竟有点儿忐忑不安起来。
接到飞机可以起飞的指令,我们的飞机便开始沿着跑道在地面上跑了起来。走到一个拐弯儿处,飞机猛地一停,还没有等我反应过来,飞机便开始加速。飞机越跑越快,外面的景物越来越不清楚。突然,我感到身体轻飘飘的,往舷窗下面一看,我们飞起来了!我向远处眺望,看见了航站楼、飞机场和我们刚刚起飞的地方。地面上的一切越来越小,直到缥缈的云雾将它们全部遮住。突然,一道金光射到了我的眼睛里,我不禁皱了一下眉头。抬头一看,一个红点从东方冉冉升起,那不是太阳吗?太阳很快占据了天空,白云在它的照耀下放射出金光,我终于明白了流光溢彩这个词语的含义。此时的我感觉像极了一只在空中自由翱翔的小鸟,上面是湛蓝的天空,下面是洁白的云团。空中地上视角不同,竟有了天壤之别。
10分钟后,飞机上开始供应食品和饮料,虽然和地面上的没什么两样,可我竟觉得口中的食物如此鲜美可口!慢慢的,我们已经升到了万米高空,屏幕上显示舱外温度为零下58摄氏度。天啊,我不由得打了一个冷战,这温度把我冻成冰棍都绰绰有余!3个小时很快过去了,飞机逐渐开始降落,我的耳朵感到越来越不适,非常疼。按照爸爸教我的方法,拼命咽口水,打哈欠,这样才好受一点。飞机一个大转弯,又向下降了,我透过窗户看到下面的土壤竟是红色的,我感觉自己好像已经挨到它们了一样。不知不觉,飞机已经落地了,而我还沉浸在飞翔的快乐之中。直到我看到了灰色的水泥地才明白我们已经到站了,2800余公里的旅途在飞机上竟是如此的短暂。
终于踏到了海南坚实的土地上,我感到这里的空气异常清新,像一个天然的大氧吧!可是这个大氧吧好像发怒了,红彤彤的太阳燎得人身上生疼生疼的,不换上短袖还真是受不了!可转眼间,炎热感就被下午即将开始的旅行冲淡了……
下午的期末考试刚结束,我就看见妈妈已经早早地来校接我了。一见我就说:“闰闰,快走,今天爸爸带你去北京。”我一听,兴奋得嘴里直嚷嚷:“耶!耶!”
去机场的路上,妈妈突然问我:“闰闰,如果让你一个人坐飞机去北京害怕吗?”
“我都已经九岁了,又不是第一次坐飞机,怎么可能害怕?”我快速地答道。
“那好,妈妈现在告诉你,由于你考试原因,你买的票是飞首都机场的,而你爸买的票是飞南苑机场的,时间上差一个半小时,也就是说,你爸先到北京,然后赶到首都机场接你。”
“什么?真的让我一个人坐飞机?”我开始有点紧张起来。
“今天就让你体验一下,爸爸妈妈不在身边的感觉。如果害怕,就不要去了。”
“谁怕啦?一个人就一个人。”我强撑着回答。谁让我刚才说大话的呀!
到了机场,妈妈找了位面善的伯伯,跟他说明情况,便把我托付给他,希望他等会在飞机上照应我。那位伯伯便在领登机牌时,要了两张在一起的座位。
过安检前,妈妈再一次叮嘱我:“爸爸在机场等你,一定要跟紧伯伯,伯伯有爸爸妈妈的电话,要是走丢了会找不到爸爸的。”看着妈妈一脸担心的表情,我赶紧装作若无其事的样子向她摆摆手说:“妈妈,别担心,没事的。”其实,我心里还真有点害怕。
过了安检,我们来到候机厅。因为我们要坐的飞机还没到,所以只好在候机厅耐心等待。大约过了半小时,飞机到了,我紧跟着那位伯伯排着队上了飞机。
飞机起飞了,我非常紧张,紧紧地抓住椅子扶手,好像一松手就会掉下去似的。“唉,要是爸爸在身边就好了。”我在心里默默地想着以前跟爸爸坐飞机时的情景。这时,旁边的伯伯看我有点紧张,就安慰我说:“别怕!现在是飞机爬升阶段,过一会儿,等飞机平飞后就会好的。”“别小看我,我才不怕呢!又不是第一次坐飞机。”为了显示自己的不怕,我赶忙把手从扶手上拿开。看着我滑稽的样子,伯伯忍不住笑了。又过了一会儿,或许是飞机到了平飞阶段,我就没那么紧张了,伯伯便陪我聊起天来……
快餐来了,空姐发给我两只透明的小盒子。一盒是鸡肉饭,另一盒里有番茄酱、面包、榨菜……说实话,中午在学校只吃了一点点,现在肚子正空着呢!我三下五除二就把食物“消灭”干净。吃完饭,我感到有些困,大概是这几天功课复习得较晚欠睡,不知不觉就靠在椅背上睡了起来。
“各位旅客,现在我们已经到达北京上空,飞机正在下降,请大家收起小桌板,系好安全带。”也不知睡了多久,耳边传来空姐的声音。我朝窗外看了看,这才发现天不知什么时候已经黑了,只见下面已是一片灯火通明。
又过了一会儿,我听到“嗤”的一声,我知道飞机已经落地了。
下了飞机,我紧紧地跟在伯伯后面,视线一刻都不敢移开,生怕自己跟丢了。在机场的出口处,我找到了前来接我的爸爸。直到那时,我一颗悬着的心才犹如一块石头落地,感到无比的踏实。
北京,我来啦……
1.首先有玩家类,窗口类,主函数类和图片文件(.jpg)
2.然后是先行知识,创建窗口(JFrame),设置窗口属性;窗口上不能直接添加组件(键盘监听等),所以先在窗口上添加容器(Jpanel),将组件(KeyAdapter)添加到容器;
3.画出玩家:重写窗口类中的paintComponent方法,创建Graphics对象,调用drawImage方法可画图,调用drawString方法可标注其名字
4.移动:在窗口类中创建键盘监听抽象类KeyAdapter(实现了接口的部分方法但无具体操作),需要重写该类的Keypressed方法和KeyRleased方法,赋给按键变量真值,随后将该对象添加到窗口
5.随机生成初始坐标:在开始游戏后随机给定玩家的x、y坐标,创建Random对象,调用Random.nextInt(n)方法,n代表从[0,n)区间的随机值。
6.最后通过一个Timer.schedule(匿名内部类对象,指定延迟后开始,周期)方法来实现移动效果。匿名内部类【TimerTask的子类,重写了run方法,包括repaint方法(实则调用paintComponent)和yidong方法】来重画、监听键盘的指令并作出相应动作
下面是源代码(有注释):
容器类
package a;
import javax.swing._;
import java.awt._;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import static a.Newgame.frame;
//新建面板
public class War extends JPanel {
private Timer timer;
private boolean sUp, sDown, sRight, sLeft;//右飞机按键变量
private boolean sW, sD, sS, sA;//左飞机按键变量
private Player1 player1 = new Player1();
private Player2 player2 = new Player2();
private ImageIcon img11 = player1.img1;
private ImageIcon img22 = player2.img2;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);//此句调用父类方法进行界面重绘,恢复到某个界面,下面的步骤再画玩家;如果注释掉会有重影
//在面板上画出玩家
g.drawImage(img11.getImage(), player1.x, player1.y, 100, 100, this);
g.drawString(“P1”, player1.x, player1.y);
g.drawImage(img22.getImage(), player2.x, player2.y, 100, 100, this);
g.drawString(“P2”, player2.x, player2.y);
}
public void startGame() {
timer = new Timer();
timer.schedule(new TimerTask() {//匿名内部类(TimerTask的子类)
@Override
public void run() {//重写run()函数
repaint();//调用重写的paintComponent来画两飞机
yidong();//并每次判断按下哪个键,然后移动
}
}, 0, 50);//安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。50毫秒执行一次
}
public void yidong() {
//因为每打印一次可能用户按下一个飞机的几个键或者两个飞机的几个键,这些是都要检测到的,改成elseif后只能检测到一个键,无法实现两架飞机同时多方向移动
if (sW && player1.y >0) {
player1.y -= player1.speed;
}
if (sA && player1.x >0) {
player1.x -= player1.speed;
}
if (sS && player1.y < 700) {
player1.y += player1.speed;
}
if (sD && player1.x < 900) {
player1.x += player1.speed;
}
if (sUp && player2.y >0) {
player2.y -= player2.speed;
}
if (sDown && player2.y < 700) {
player2.y += player2.speed;
}
if (sLeft && player2.x >0) {
player2.x -= player2.speed;
}
if (sRight && player2.x < 900) {
player2.x += player2.speed;
}
}
public void act() {
//随机生成两飞机的初始坐标
Random rd = new Random();
player1.x = rd.nextInt(900);
player1.y = rd.nextInt(700);
player2.x = rd.nextInt(900);
player2.y = rd.nextInt(700);
//开始游戏后获得计时器开始监听并重画
startGame();
//KeyAdapter是KeyListener的实现类,重写了所有方法但没有具体操作
KeyAdapter keyAdapter = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_W:
sW = true;
break;
case KeyEvent.VK_A:
sA = true;
break;
case KeyEvent.VK_D:
sD = true;
break;
case KeyEvent.VK_S:
sS = true;
break;
case KeyEvent.VK_RIGHT:
sRight = true;
break;
case KeyEvent.VK_LEFT:
sLeft = true;
break;
case KeyEvent.VK_DOWN:
sDown = true;
break;
case KeyEvent.VK_UP:
sUp = true;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_W:
sW = false;
break;
case KeyEvent.VK_A:
sA = false;
break;
case KeyEvent.VK_D:
sD = false;
break;
case KeyEvent.VK_S:
sS = false;
break;
case KeyEvent.VK_RIGHT:
sRight = false;
break;
case KeyEvent.VK_LEFT:
sLeft = false;
break;
case KeyEvent.VK_DOWN:
sDown = false;
break;
case KeyEvent.VK_UP:
sUp = false;
break;
}
}
};
frame.addKeyListener(keyAdapter);
}
}
主函数类:
package a;
import javax.swing._;
public class Newgame {
public static JFrame frame;
public static void main(String[] args) {
frame = new JFrame(“逃出生天”);
frame.setSize(1000,800);
//绝对布局组件位置和形状不会随窗体改变,不设置布局管理器就可以使用setBounds()来控制位置
frame.setLayout(null);
//设置窗体关闭程序自动关闭
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//窗体居中显示
frame.setLocationRelativeTo(null);
//添加主面板
War war = new War();
frame.add(war);
//设置面板大小
war.setBounds(0,0,1000,800);
//设置主面板可见
frame.add(war);
frame.setVisible(true);
war.act();
}
}
123456789101112131415161718192223242526
玩家类:
玩家1
package a;
import javax.swing._;
public class Player1 {
public int x;
public int y;
public int speed = 50;
public ImageIcon img1 = newImageIcon(“D:\\Program_Files\\Jetbrains\\workspace_idea\\src\\a\\plane.jpg”);
}
12345678910
玩家2
package a;
import javax.swing._;
public class Player2 {
public int x;
public int y;
public int speed = 50;
public ImageIcon img2 = newImageIcon(“D:\\Program_Files\\Jetbrains\\workspace_idea\\src\\a\\plane2.jpg”);
}
做成一个桌面小游戏:
点“+”号
选好主函数类后点ok
然后点Build中的Build Artificts
选择jar包点Build即可
然后jar包就在你的workspace生成了,找到它发送桌面快捷方式,更改图标名字即可
图片转换成图标的网站附上
用Java制作游戏之前,一定要做到方向明确,思路清晰。首先确定自己需要用到几个类,类里的内容大致是什么,用脑图进行表达展现。
Java语言是一种跨平台、适合于分布式计算环境的面向对象编程语言,具有简单性、面向对象、分布式,多线程性等,其中面向对象有封装,继承,多态三大特性。
1)封装:数据和基于数据的操作封装
2) 继承:一个对象直接使用另一个对象的属性和方法,子类可以继承父类
3) 多态:一个程序中同名的多个不同方法,实现多态的常见方法 子类对父类的覆盖,利用重载在同一个类中定义多个同名的不同方法;
Java游戏制作中必须有 public static void main(String[]args)的主方法,main()方法是程序执行的入口。例如我的飞机大战main(),便是游戏开始执行的入口,写在GameFace类中。
游戏框架的制作,其大部分的代码都是固定形式,可以通用。使用setVisible(true)的方法,改变默认的不可见状态,setLayout(null)取消默认的管理布局,然后setLocation(),setSize(),setBound()等方法设置其大小。将按钮添加监听,实现监听。在对应方法中编写代码,,为监听者创建对象,完成注册,即在接口名字前添加“add”。
游戏版面要继承JPanel,其原因是JPanel带有双缓冲技术,可以解决闪烁的问题,需要加入到JFrame窗体中,JPanel默认的布局管理器是FlowLayout。调用画笔,将所要显示的图片画出来。然后再根据自己的思路,在游戏版面内添加敌机,实现矩形碰撞,生命值判定,游戏结束对话框。要熟练掌握调用其他的类,画出分数,画出生命值。制作容器,装子弹,飞机,炸弹。
制作游戏思路一定要清晰,对于共有属性,可以建立一个父类,例如在创建一个FlyingObject类,这样可以避免代码的反复编写。对于子类myplane、enemies可以直接继承父类,子类可以根据自己的需求再增加新的变量。在子类myplane中,画出我的飞机,控制飞机飞行的边界,调用子弹容器,画出容器中子弹,与敌机进行碰撞检测。飞机大战还应该实现键盘监听,例如Enter键实现暂停,上下左右键实现移动等。在敌机Enemies类中,定义敌机随机出现坐标,敌机图片的相对路径,敌机速度,敌机子弹与我的plane碰撞出现的结果以及敌机子弹生成的时间等。
游戏制作时需要注意的事项:1.JLabel的位置一定要放对,应当先添加背景JLabel,再添加其它控件。否则其它控件将被JLabel所遮挡。
2.对于多次重复编写的代码,尽可能的用for循环,简单方便。但是也要注意跳出语句的使用。
3.调用函数时要注意顺序
4.类名,方法名要遵循命名规范性,尽量做到见名知义,也要注意大小写。
线程:进程(process)就是一块包含了某些资源的内存区域。操作系统利用进程把它的工作划分为一些功能单元。线程:进程中所包含的一个或多个执行单元称为线程(thread)。进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问。 线程和进程的区别如下:1)一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。2)线程在执行过程中与进程的区别在于每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。3)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用来实现进程的调度和管理以及资源分配。
2 简述线程的状态及其转换 1)New,创建一个线程,但是线程并没有进行任何的操作。2)Runnable,新线程从New状态,调用start方法转换到Runnable状态。线程调用start方法向线程调度程序(JVM或者是操作系统)注册一个线程,这个时候一切就绪只等CPU的时间。3)Running,从Runnable状态到Running状态,线程调度根据调度策略的不同调度不同的线程,被调度执行的线程进入Running状态,执行run方法。4)Dead状态,从Running状态到Runnable,run方法运行完毕后,线程就会被抛弃,线程就进入Dead状态。5)Block状态,从Running状态到Block状态,如果线程在运行的状态中因为I/O阻塞、调用了线程的sleep方法以及调用对象的wait方法则线程将进入阻塞状态,直到这些阻塞原因被结束,线程进入到Runnable状态。
3 简述线程的两种创建方式以及它们的区别 创建线程的两种方式:1)使用Thread创建线程。Thread类是线程类,其每一个实例表示一个可以并发运行的线程。我们可以通过继承该类并重写run方法来定义一个具体的线程。其中重写run方法的目的是定义该线程要执行的逻辑。启动线程时调用线程的start方法而非直接调用run()方法。start()方法会将当前线程纳入线程调度,使当前线程可以开始并发运行。当线程获取时间片段后会自动开始执行run方法中的逻辑。2)使用Runnable创建线程。实现Runnable接口并重写run方法来定义线程体,然后在创建线程的时候将Runnable的实例传入并启动线程。两种创建线程方式的区别: 使用Thread创建线程,编写简单,可以直接操纵线程,无需使用Thread.currentThread(),但是不能够再继承其他类。使用Runnable创建线程可以将线程与线程要执行的任务分离开减少耦合,同时Java是单继承的,定义一个类实现Runnable接口,这样该类还可以继承自其他类。
多线程实现方法
使用Thread创建线并启动线程
java.lang.Thread类是线程类,其每一个实例表示一个可以并发运行的线程。我们可以通过继承该类并重写run方法来定义一个具体的线程。其中重写run方法的目的是定义该线程要执行的逻辑。启动线程时调用线程的start()方法而非直接调用run()方法。start()方法会将当前线程纳入线程调度,使当前线程可以开始并发运行。当线程获取时间片段后会自动开始执行run方法中的逻辑。
public class TestThread extends Thread{
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(“我是线程”);
}
}
}
创建预启动线程
…
Thread thread = new TestThread();//实例化线程
thread.start();//启动线程
…
使用Runnable创建并启动线程
实现Runnable接口并重写run方法来定义线程体,然后在创建线程的时候将Runnable的实例传入并启动线程。这样做的好处在于可以将线程与线程要执行的任务分离开减少耦合,同时java是单继承的,定义一个类实现Runnable接口这样的做法可以更好的去实现其他父类或接口。因为接口是多继承关系。
public class TestRunnable implements Runnable{
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(“我是线程”);
}
}
}
启动线程的方法:
…
Runnable runnable = new TestRunnable();
Thread thread = new Thread(runnable);//实例化线程并传入线程体
thread.start();//启动线程
…
使用内部类创建线程
通常我们可以通过匿名内部类的方式创建线程,使用该方式可以简化编写代码的复杂度,当一个线程仅需要一个实例时我们通常使用这种方式来 创建。 例如:继承Thread方式:
Thread thread = new Thread(){ //匿名类方式创建线程
public void run(){
//线程体
}
};
thread.start();//启动线程
Runnable方式:
Runnable runnable = new Runnable(){ //匿名类方式创建线程
public void run(){
}
};
Thread thread = new Thread(runnable);
thread.start();//启动线程
线程的方法
currentThread:方法可以用于获取运行当前代码片段的线程
Thread current = Thread.currentThread();
获取线程信息 Thread提供了 获取线程信息的相关方法: long getId():返回该线程的标识符 StringgetName():返回该线程的名称 int getPriority():返回线程的优先级 Thread.state getState():获取线程的状态boolean isAlive():测试线程是否处于活动状态 boolean isDaemon():测试线程是否为守护线程 booleanisInterrupted():测试线程是否已经中断
线程优先级
线程的切换是由线程调度控制的,我们无法通过代码来干涉,但是我们可以通过提高线程的优先级来最大程度的改善线程获取时间片的几率。线程的优先级被划分为10级,值分别为1-10,其中1最低,10最高。线程提供了3个常量来表示最低,最高,以及默认优先级:Thread.MIN_PRIORITY, Thread.MAX_PRIORITY, Thread.NORM_PRIORITY 设置优先级的方法为:
void setPriority(int priority)
守护线程
守护线程与普通线程在表现上没有什么区别,我们只需要通过Thread提供的方法来设定即可: __void setDaemon(boolean )__当参数为true时该线程为守护线程。 守护线程的特点是,当进程中只剩下守护线程时,所有守护线程强制终止。 GC就是运行在一个守护线程上的。需要注意的是,设置线程为后台线程要在该线程启动前设置。
Thread daemonThread = new Thread();
daemonThread.setDaemon(true);
daemonThread.start();
sleep方法
Thread的静态方法sleep用于使当前线程进入阻塞状态: __static void sleep(long ms)__该方法会使当前线程进入阻塞状态指定毫秒,当指定毫秒阻塞后,当前线程会重新进入Runnable状态,等待分配时间片。该方法声明抛出一个InterruptException。所以在使用该方法时需要捕获这个异常 改程序可能会出现“跳秒”现象,因为阻塞一秒后线程并非是立刻回到running状态,而是出于runnable状态,等待获取时间片。那么这段等待时间就是“误差”。所以以上程序并非严格意义上的每隔一秒钟执行一次输出。
yield方法:
Thread的静态方法yield: __static void yield()__该方法用于使当前线程主动让出当次CPU时间片回到Runnable状态,等待分配时间片。
join方法
__void join()__ 该方法用于等待当前线程结束。此方法是一个阻塞方法。 该方法声明抛出InterruptException。
线程同步
synchronized关键字 多个线程并发读写同一个临界资源时候会发生“线程并发安全问题“ 常见的临界资源: 多线程共享实例变量多线程共享静态公共变量 若想解决线程安全问题,需要将异步的操作变为同步操作。 所谓异步操作是指多线程并发的操作,相当于各干各的。所谓同步操作是指有先后顺序的操作,相当于你干完我再干。
同步代码块(synchronized 关键字 ),同步代码块包含两部分:一个作为锁的对象的引用,一个作为由这个锁保护的代码块这个比较难理解故写了下面代码帮助理解
/__
_ 多线程并发安全问题
_ 当多个线程同时操作同一资源时,由于
_ 线程切换时机不确定,导致出现逻辑混乱。
_ 严重时可能导致系统崩溃。
_ @author ylg
_
_/
public class SyncDemo1 {
public static void main(String[] args) {
/_
_ 当一个方法中的局部内部类想引用该方法
_ 的其他局部变量时,这个变量必须被声明
_ 为final的
_/
final Table table = new Table();
Thread t1 = new Thread(){
public void run(){
while(true){
int bean = table.getBean();
Thread.yield();//模拟线程切换
System.out.println(
getName()+”:“+bean
);
}
}
};
Thread t2 = new Thread(){
public void run(){
while(true){
int bean = table.getBean();
Thread.yield();//模拟线程切换
System.out.println(
getName()+”:“+bean
);
}
}
};
t1.start();
t2.start();
}
}
class Table{
//20个豆子
private int beans = 20;
/__
_ 当一个方法被synchronized修饰后,该方法
_ 成为”同步方法“。多个线程不能同时进入到
_ 方法内部。
_ @return
_/
public synchronized int getBean(){
if(beans==0){
throw new RuntimeException(”没有豆子了!“);
}
Thread.yield();//模拟线程切换
return beans--;
}
}
/__
_ 有效的缩小同步范围可以保证在
_ 安全的前提下提高了并发的效率
_ @author ylg
_
_/
public class SyncDemo2 {
public static void main(String[] args) {
final Shop shop = new Shop();
Thread t1 = new Thread(){
public void run(){
shop.buy();
}
};
Thread t2 = new Thread(){
public void run(){
shop.buy();
}
};
t1.start();
t2.start();
}
}
class Shop{
/_
_ 在方法上使用synchroinzed,同步监视器对象即当前方法所属对象:this
_/
// public synchronized void buy(){
public void buy(){
try{
Thread t = Thread.currentThread();
System.out.println(t+”正在挑选衣服..“);
Thread.sleep(5000);
/_
_ 同步块可以缩小同步范围。
_ 但是必须保证”同步监视器“即:”上锁对象“是同一个才可以。
_ 通常,在一个方法中使用this所谓同步监视器对象即可。
_/
synchronized (this) {
System.out.println(t+”正在试衣服..“);
Thread.sleep(5000);
}
System.out.println(t+”结账离开“);
}catch(Exception e){
}
}
}
/__
_ synchronized也成为”互斥锁“
_ 当synchronzed修饰的是两段代码,但是”锁对象“相同时,这两段代码就是互斥的。
_ @author ylg
_
_/
public class SyncDemo4 {
public static void main(String[] args) {
final Boo b = new Boo();
Thread t1 = new Thread(){
public void run(){
b.methodA();
}
};
Thread t2 = new Thread(){
public void run(){
b.methodB();
}
};
t1.start();
t2.start();
}
}
class Boo{
public synchronized void methodA(){
Thread t = Thread.currentThread();
System.out.println(t+”正在调用方法A“);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
System.out.println(t+”调用方法A完毕“);
}
public synchronized void methodB(){
Thread t = Thread.currentThread();
System.out.println(t+”正在调用方法B“);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
System.out.println(t+”调用方法B完毕");
开发登录界面、设计地图加载、子弹飞机的加载、主控制程序的开发登录界面的开发,通常是在界面上显示游戏菜单选项,用户可根据菜单项选择需要的操作。菜单项是和游戏的功能紧密相关的。手机游戏的开发往往在界面和操作方式上有较高的要求,JavaME提供了低级界面开发的API,可用于游戏开发。低级界面画布类主要有Canvas和GameCanvas,其中Canvas是属于MIDP1.0,GameCanvas则是属于MIDP2.0。低级用户界面技术为用户提供了灵活的开发方法,可以进行一些较为底层的操作,例如:按键的处理事件更为丰富,组件位置的设置更为灵活。手机上的屏幕坐标系和我们常规数学的坐标系不相同。对于坐标(x,y),若x值越大,则越向右,y值越大,则越向下。对于飞机射击游戏,飞机在飞行过程中经过不同的地理环境,例如大海、小岛、石礁等作为地图的背景。地图的宽度通常要求能够自动匹配不同类型的手机宽度,高度则是以一个关卡所需的时间为依据进行设计。在此我们采用简化操作方法,给地图宽度和高度设置一个具体值。子弹的射击应该支持不同的方向,例如我方飞机自下而上发射子弹,敌方飞机自上而下发射子弹。当子弹与飞机碰撞之后,飞机的血量相应地要减少,如果飞机的血量为0,则产生爆炸效果,子弹和飞机都消失。飞机主角在开始游戏时出现在屏幕最底部的中间处,玩家可以通过上、下、左、右键控制其飞行方向,按下确认键后可以发射子弹。敌机在游戏开始后从背景上部出现,飞行,并发射子弹。在本任务中需要考虑敌机出现的位置,出现的数量和频率,飞行的速度和子弹的发射方向。
为了更好地控制游戏的主体逻辑,可以统一对游戏地图进行设置,对主角飞机、敌方飞机初始化,并在多线程中实现游戏的逻辑控制。
游戏主框架的首要模块的安排:
1.游戏的初始化。主要是完成游戏资源的加载,各种游戏对象、变量取值的初始化,游戏运行环境的获取和设置,历史记录的读取等。
2.游戏的主循环。执行游戏处理的主要代码,直到满足退出要求才停止循环,例如:玩家选择退出游戏,玩家游戏失败,玩家最终完成游戏等。主要实现分为三步:(1)获得游戏的输入信息;(2)处理游戏的逻辑;(3)更新游戏的画面
3.退出游戏
Canvas为抽象类,负责图形图像的绘制和用户交互。进行低级玩家界面的开发通常需要继承Canvas类,主要方法如下:
1.getHeight():获取Canvas绘图区域的高度。
2.getWidth():获取Canvas绘图区域的宽度。
3.paint(Graphics g):渲染画布,向屏幕画图,通常将画图的操作放在该方法中实现。当屏幕需要重新绘制时,JavaME主线程会自动调用paint方法,程序员不能在代码中直接声明调用该方法。
4.repaint():主动向系统请求刷新界面,具体的刷新操作实际是通过调用paint方法来完成。
5.isDoubleBuffered():判断手机设备是否匹配双缓冲。有些手机匹配双缓冲技术,有些则不匹配。
6.getGameAction(int keyCode):将手机的键值切换为游戏动作。
7.getKeyName(keyCode):得到按键的名字。
Graphics提供2D渲染能力,作用是在屏幕上绘制图形,类似于一支画笔。
Graphics绘制的图形不能够直接显示,必须通过Canvas或GameCanvas才能显示在屏幕上,因此Canvas和GameCanvas类似于可以显示图形的画布
Graphics类支持绘制图形主要包括以下3种:
(1)文本:可以设置文本的颜色、字体大小等
(2)图像:可以直接绘制图像文件或者从缓存中绘制
(3)2D几何图形:绘制点、直线、平面图形等
Graphics类没有构造方式,获取对象的途径有3种:
1.Canvas类中的paint方法有一个Graphics对象参数,系统会自动调用paint方法,并传进一个Graphics对象,因此可以在paint方法中使用Graphics对象编写绘图代码。
2.在GameCanvas类中通过getGraphics方法来获取一个Graphics对象,因此可以在要求的地方灵活地编写与绘图有关的代码。
3.Image对象的getGraphics()方法得到Graphics对象,可用于编写双缓冲区代码。
1.直接用整幅图片作为背景,再在上面重叠一层加入物件、摆设等,优点在于图形相对丰富、漂亮,但消耗资源较多,受手机硬件条件的影响不能做太大的图。
2.游戏地图是用一个个图块重复拼接成,而在程序中就可以通过一个较小的图像文件和一个二维数组,绘制出一幅较大的地图。具体的做法是将图像文件划分为若干个相同大小的图块(一般每个图块是16像素× 16像素或者32像素 ×32像素),每个图块给一个索引值,例如:1表示草地图块,2表示砖头图块。而二维数据中记录的数字就是图像文件中的图块索引值,例如:某个数组元素的数值若为1,则表示在此处画草地。此方法的益处在于比较节约系统资源,可做出来的地图相对比较一般。
地图编辑器能够帮助将地图最后转变成程序直接使用,所以一个好的地图编辑器能够加速游戏的开发周期。
业界已经推出多款地图编辑器,例如Mappy(MapWin)、Tiled、TILESTUDIO等,其中Mappy功能比较强大,可以很方便地对2D地图进行编辑。
下载mayppy软件:HTTP:/ / www.tilemap.uk /mappy
假如需支持png图片,那么还需下载两个dll文件,这两个文件也都放在Mappy软件的网址上
zlib.dll用于文件压缩
libpng12.dll是PNG图像压缩库
将这两个文件下载复制到Mappy可执行文件的同一个目录下即可,否则在导入PNG文件时,会报图5-23的错误
制作游戏还需要用到图像素材,因此除了Mappy软件之外,还需要用到图像处理软件Photoshop来制作原始游戏素材。
J2SE中提供了多个接口和类管理集合,例如有Collection、List、Set、Map接口,实现接口的集合类有LinkedList、ArrayList、Vector、Hashtable、HashMap和WeakHashMap类。
在JavaME中只有java.util包提供Vector类,其功能和J2SE的Vector类似,实现的是一个动态增长的数组,可以在程序代码中调整或者裁减集合的大小,能向集合插入、删除和修改元素。
每一个集合中的元素都被分派一个整数索引号,能够直接根据索引号插入和删除一个元素,也能够修改和得到一个元素的值。
为了更好地控制游戏的主体逻辑,可以统一对游戏地图进行设置,对主角飞机、敌方飞机初始化,并在多线程中实现游戏的逻辑控制。
转眼已实习四周,经过一段时间的观察,我发现了一个工作人员之间交流的特点,这个疑问迎刃而解。在飞机的维修过程中,很多工作是需要工作人员协调配合才可以进行的,顺利完成后,我们的工作人员之间有一个习惯的手势,就是高高的竖起大拇指。很多时候我也会听到他们之间互相称赞“出色”、“完美”、“太棒了”这样的字眼。
其实每天这样需要协作的工作很多,完成也是理所应当,但是每一次大家都会竖起大拇指,会毫不吝啬的互相赞美。我想在这种高压环境下来自工作人员之间互相的认可和鼓励是非常有必要的,这种强激励法的有效运用也是十分科学的。
在A检实习的日子马上就要结束了,我很珍惜这段短暂的实习生活,让我对机务工作产生了一种很奇妙的情愫。我想起乔布斯在斯坦福大学学位颁授典礼上的演讲,他说:“你必须找到你所喜欢的东西。工作上是如此,对情侣也是如此。你的工作将占据你生命中大半个人生,唯一能真正获得满足的方法是做你认为伟大的工作。”
机务工作是不被大众了解的未知领域,甚至连我的父亲都不知道自己的女儿在做些什么,少了向朋友炫耀的资本。可是我从未如此骄傲过。是的,机务工作没有光鲜的头衔,没有华丽的'工作服,没有宽敞明亮的办公室,但是我们固定的每一个小小的螺钉,打印的每张薄薄的工作单承载的都是对生命安全的保障!
人生除却生死,何为大事?难道机务工作还不伟大吗?在选择工作的时候我就对自己说,要到需要我的地方去,到可以让我成长的地方去,到让我实现自我价值的地方去。我坚信国航工程技术分公司就是最适合我的地方,是实现理想的天地。坚守信念,仰望星空,脚踏实地。
我被分派在C检实习,在C检的维修过程中,每天下午3点都会开协调会议,以便各部门及时反映工作中遇到的问题,及时调整。开始我觉得每天开会有些浪费时间,工作内容按照工卡按部就班的执行就可以了,哪会有那么多的问题需要处理。后来发现这样的会议是有其必要性和实际意义的。可能在维修过程中一个部门不会有什么问题,可是组合起来就会有一些矛盾,而会议能够让这些矛盾暴露出来,及时解决掉,避免在飞机出厂前才发现维修漏洞导致师傅们加班或者无法保证飞机的安全适航而影响出厂时间。
我深刻感受到飞机维修确实是一个极其严谨的工作,每一个细节都要认真的完成好,保障安全绝非儿戏。
来到航线定检PPC实习已经快两周了,我对工作内容有了初步的了解。生产准备控制中心主要是关于飞机定检生产准备、调度,流程控制、工程管理以及出厂报告的编写。在此之前我对飞机A检、C检的内容和区别完全不了解,经过师傅的讲解我学习到,飞机一般按飞行小时和起落架次分为A检、C检和D检。
在维修深度维修周期,维修人员等的要求上都有很大的不同。这些知识对我这个从未接触过飞机维修的外行人来说还是很难理解透彻的。我对飞机定检的生产准备工作仅是很感性的认知,但我仍然相信这种停留在感性的认知更真切,更直观。
飞机加油员岗位实习心得体会
随着新年钟声的敲响,我们又迎接了新一年度的到来。在20xx年度年我非常荣幸的成为XXX公司的一名新员工,作为即将走上工作岗位的飞机加油员,我历经了为期半年的培训和实习,尤其是和老员工一起工作,让我对XXX公司,飞机加油事业。以及XX公司精神有了以下的心得和体会。
在公司实习的半年以来,我深深的了解到我公司作为一家海南美亚实业有限责任公司,拥有着其独特的公司文化,和悠久的历史,以及辉煌的业绩。这让加入XX公司并成为其中一员的我倍感荣幸。我十分感谢我XX公司为我们工作人员所提供的舞台,它实现了我们的价值,体现了我们的能力。因此,我只有早日融入企业,在更短的时间内发挥出自己的良好实力,并将在半年来的实习工作中多学习到知识深入结合到实际工作中,才能在企业中更好地发挥自身的价值,为我XX公司做出贡献。
要想融入企业,就必须要了解和接受企业的文化。每个企业都有其独特的文化与意义。而我公司的企业文化则深深贯彻了“以人为本”的基本理念。我公司的领导、机关部门以及负责人均及时接触新员工,深入了解新员工的工作,以及思想建设情况,并实际为新进员工解决了学习上、工作上以及思想上的部分困难,这充分展现出了我XX公司对新进员工的关怀与照料,这种以人为本,关爱员工的人为关怀让我深受感动。
由于刚刚来到了一个新的工作环境中,在一开始,我并不能很好的适应飞机加油员岗位的工作。其实,飞机加油也是一个技术含量极高的工种。表面看是接上油管,开几个阀门就可以完成作业的。但是作为一名合格的飞机加油员就要既懂得油品专业知识,也懂得加油车辆设备的操作与相关技术数据,并且还应掌握各种常见航空器发动机的基本知识。同时,飞机加油也是一项严谨而又细致的工作,它担负着航空器和旅客安全的重任。因此,我在日常的加油工作中,坚持没有任何的松懈,严格执行民航总局和公司颁布的安全条例和禁令,严格按照工作流程来操作,为我XX公司各飞机的安全飞行带来保障。在半年来的`实习工作中,我虽历经坎坷与困难,却坚持不放弃的做好各项岗位工作,做到及时向老员工前辈学习,虚心吸取经验,并充分利用自身的业余时间不断的进行学习,以此来补充自身的专业知识,并坚持学以致用,实际提高自身的专业技能,力求在实践中不断的提高自身的综合素质和技术能力,为我公司的实际发展竭尽所能。在工作中,我力争从细微处着手,坚持勤勤恳恳做事,老老实实做人的工作理念和作风。
总之,通过为期半年的培训,我更加坚定了自己对飞机加油岗位的工作热情,并立志要为我XX公司的发展做出应有的贡献和努力,虽然,我现在还没有考取到上岗证,不能独立上岗。但是,我会加倍努力,争取在10月份考上岗证,实际走向飞机加油事业。
★ 折飞机范文
★ 折纸飞机作文
★ 飞机的脑筋急转弯
★ 拼飞机模型
★ 飞机运输合同
★ 做飞机作文
★ 飞机乘务员检讨书
★ 飞机欢迎词范文