JAVA多线程.docx
- 文档编号:25311589
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:23
- 大小:125.33KB
JAVA多线程.docx
《JAVA多线程.docx》由会员分享,可在线阅读,更多相关《JAVA多线程.docx(23页珍藏版)》请在冰豆网上搜索。
JAVA多线程
JAVA
课程设计报告
GUI与多线程
题目名称
GUI与多线程
班级
学号
姓名
指导教师
编写时间
目录
1.实验题目名称-3-
2.实验目的与任务-3-
3.设计思想和实现方法-3-
4.程序说明-5-
5.程序运行结果-7-
6.存在问题及分析-9-
7.总结及体会-9-
参考文献-9-
附录一-10-
附录二-16-
1.实验题目名称
1、文字与图形GUI设计
2、多线程设计。
2.课程设计目的与任务
(1)实验目的:
1、使用并掌握eclipse平台;
2、了解JAVA语言基础并学会利用GUI画图及实现多线程设计。
(2)实验任务:
.画出三个图形背景、男孩(红脸蛋),女孩(红脸蛋)、桃心;
.分别使用多线程使男孩、女孩、桃心、红脸蛋动起来;
.添加按钮的事件响应;
.添加音乐;
3.设计思想和实现方法
本程序设计思路大体分为三大块:
画图、事件响应原理和多线程。
首先列出各种包的继承关系如下,以后程序都要搞清楚这些关系:
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Panel
java.applet.Applet
java.swing.JApplet
一、对于画图部分分为几何图形和多边形:
首先画几何图形要遵循以下步骤:
创建一个Graphics2D类对象;
(a)创建一个几何形状类geom的对象shape;
(b)按要求设置Graphics2D类的对象的属性;
(c)调用Graphics2D类的对象的draw(shape)方法绘制集合图形;
(d)需要填充的只需在(d)中的draw(shape)换成fill(shape);
其次是画多边形,在Java2DAPI中绘制多边形的步骤如下:
(a)创建多边形的x坐标数组与y做标数组;
(b)创建GeneralPath类的几何图形的路径对象;
(c)调用类路径对象的成员方法moveTo(),将准备抬笔移动的点(彼此间无连线的点)的坐标添加到路径对象中;
(d)调用路径对象的成员方法lineTo(),将准备从当前位置画直线的点的坐标添加到历经对象中;
(e)若要画封闭多边形,则应调用路径对象的成员方法closePath()来进行这一设置;
(f)调用Graphics2D的对象的成员方法draw()或fill()画多边形。
2、对于按钮事件响应原理,当单击一个按钮时,按钮为监听者对象发送一个“动作事件”的事件对象,通过按钮这个事件源来激活一个事件。
因此实践中,要先建立一个事件源和监听者对象,通过调用addActionListener()来实现。
对于外部的类的监听者对象必须要声明一个ActionListener接口。
3、对于多线程,可以通过Thread类(线程类)来创建新线程,它的一个完整的生命周期通常要经历新生、就绪、运行、阻塞和死亡这5个状态,其实现方法如下图一:
start
Notify或Notifyall
超过分配分配cpu
I/O请求
waitI/O完成
suspend
sleep
Stop或完成
超过睡眠间隔resume
图一线程的生命周期
Thread类是java.lang包中专门用来创建线程和对线程进行操作的类。
Java在Thread类中定义了许多方法:
(a)构造方法。
如publicThread(Stringname)等。
(b)run()方法。
该方法用来定义用户线程要执行的操作。
(c)改变线程状态的方法,如start()、sleep()、stop()等。
(d)其他方法,如setPriority()、setName()等。
在Java语言中创建线程一般有两种方法:
一是以创建Thread类的子类为途径,二是以实现Runnable接口为途径。
具体实现见源程序。
4.程序说明
本程序分为tupian和music两个包。
tupian包主要实现画图、按钮事件响应及多线程功能,在该包中有2个类tupian类和CBox类。
tupian类实现按钮事件,CBox类实现画图及4个多线程。
music包中有两个类musicextendsFrame和main()主方法。
完整程序见附录:
5.程序运行结果
6.存在问题及分析
本来打算利用按钮事件弹出心,但图片不知道怎么包含到工程下面,一直加不进去。
当时也想过要通过设置线程优先级或用join()来实现心突然迸发出的效果,但需要在tupian包的CBox类中创建main()方法,由于先执行tupian类,所以不能在CBox类中创建main()方法,因此没能实现。
后来,我又想到可以通过设置线程的方法可以实现,即设置合适的睡眠时间。
最终还是实现了最初的设想。
7.总结及体会
通过这次实验,我深刻的理解了java各种包之间的关系,明白了事件响应原理及多线程的实现;当然实验的过程中也碰到了很多问题,然后尝试各种不同的方法,在这个过程中我也学会了分析问题解决问题的方法,这当然也是作为一个软件开发者应具有的素质。
在张老师的指导下,我顺利的完成了本次实验,在此衷心的感谢张老师的帮助!
参考文献
[1]张白一崔尚森,《面向对象程序设计---Java》(第二版),西安电子科技大学出版社
[2]高宏静,《Java从入门到精通》,化学工业出版社
附录一tupian包:
packagetupian;
importmusic.*;
importjava.applet.*;
importjava.awt.*;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.geom.*;
importjava.awt.geom.QuadCurve2D.Double;
importjava.io.File;
import.MalformedURLException;
import.URL;
importjavax.swing.*;
publicclasstupianextendsJAppletimplementsActionListener
{
Containercp=getContentPane();
JButtonbt=newJButton();
publicvoidinit()
{
try
{
URLcb;
Filef=newFile("F:
\\轻音乐-安妮的仙境.wav");
cb=f.toURL();
AudioClipaau;
aau=Applet.newAudioClip(cb);
aau.loop();//循环播放aau.play()单曲aau.stop()停止播放
musicframe=newmusic();
}
catch(MalformedURLExceptione)
{
e.printStackTrace();
}
CBoxpa=newCBox();
pa.setBackground(Color.cyan);
cp.add(pa,BorderLayout.CENTER);
bt.setRolloverEnabled(true);
bt.setText("点我有惊喜哦!
");
bt.setHorizontalTextPosition(JLabel.CENTER);
bt.setVerticalTextPosition(JLabel.BOTTOM);
cp.add(bt,BorderLayout.SOUTH);
bt.addActionListener(this);
}
publicvoidactionPerformed(ActionEvente)//事件响应
{
if(e.getSource()==bt)
{
if(bt.getText()=="点我有惊喜哦!
")
bt.setText("哈哈!
");
else
bt.setText("点我有惊喜哦!
");
}
}
}
classCBoxextendsJPanel
{
intx,y,b,by,g1,gy1,gx2,gy2,g3,gy3,g4,gy4,t1,ty1,t2,ty2,t12,ty12,t22,ty22,t3,ty3,t4,ty4,t31,ty31,t41,ty41,x11,y11,x12,y12,x13,y13;
Threadth1=null;
intnx,ny;
Threadth2=null;
intxx,xy;
Threadth3=null;
intp,q;
Threadth4=null;
publicCBox()
{
Threadth1=newGirlThread();
th1.start();
Threadth2=newBoyThread();
th2.start();
Threadth3=newXinThread();
th3.start();
Threadth4=newLianThread();
th4.start();
}
classGirlThreadextendsThread
{
publicvoidrun()
{
x=300;y=0;b=265;by=0;g1=300;gy1=0;gx2=235;gy2=0;g3=370;gy3=0;g4=435;gy4=0;t1=300;ty1=0;t2=300;ty2=0;t12=300;ty12=0;t22=310;ty22=0;t3=370;ty3=0;t4=370;ty4=0;t31=370;ty31=0;t41=380;ty41=0;x11=335;y11=0;x12=235;y12=0;x13=435;y13=0;
while(x<400||b<365||g1<400||gx2<335||g3<470||g4<535||t1<400||t2<400||t12<400||t22<400||t3<470||t31<470||t41<480)
{
x=x+5;b=b+5;
g1=g1+5;gx2=gx2+5;
g3=g3+5;g4=g4+5;
t1=t1+5;t2=t2+5;
t12=t12+5;t22=t22+5;
t3=t3+5;t4=t4+5;
t31=t31+5;t41=t41+5;
x11=x11+5;x12=x12+5;
x13=x13+5;
repaint();
try
{th1.sleep(300);}
catch(InterruptedExceptione){};
}
}
}
classBoyThreadextendsThread
{
publicvoidrun()
{
nx=0;ny=0;
while(nx>-370)
{
nx=nx-30;
repaint();
try
{th2.sleep(400);}
catch(InterruptedExceptione){};
}
}
}
classXinThreadextendsThread
{
publicvoidrun()
{
xx=0;xy=0;
try
{
th3.sleep(6200);
xy=xy+275;
repaint();
}
catch(InterruptedExceptione){};
}
}
classLianThreadextendsThread
{
publicvoidrun()
{
p=0;q=0;
try
{
th4.sleep(6800);
q=q+174;//124;/////////////////////////
repaint();
}
catch(InterruptedExceptione){};
}
}
publicvoidpaintComponent(Graphicsg)
{
super.paintComponent(g);
Graphics2Dg2=(Graphics2D)g;
g2.setStroke(newBasicStroke
(2));
setBackground(Color.cyan);
QuadCurve2D.DoubleLine8=newQuadCurve2D.Double(0,350,30,150,1500,350);//画草地
g2.setPaint(Color.green);
g2.draw(Line8);
g2.fill(Line8);
Rectangle2D.Doublerec=newRectangle2D.Double(0,350,1500,600);
g2.draw(rec);
g2.fill(rec);
g2.setPaint(Color.pink);//画女孩的脸
Ellipse2D.Doublee1=newEllipse2D.Double(x,y+100,70,70);
g2.fill(e1);
g2.setPaint(Color.black);
g2.draw(e1);
g2.setPaint(newColor(255,60,60));//画红脸蛋
Ellipse2D.Doublee111=newEllipse2D.Double(p+446,q-50,25,25);//////////
g2.fill(e111);
g2.setPaint(Color.black);
g2.draw(newArc2D.Double(b,by+100,140,90,90,125,Arc2D.OPEN));//画女孩的鞭子
Line2D.DoubleLine2=newLine2D.Double(g1,gy1+240,gx2,gy2+275);//画女孩的胳膊
Line2D.DoubleLine3=newLine2D.Double(g3,gy3+240,g4,gy4+275);
Line2D.DoubleLine4=newLine2D.Double(t1,ty1+350,t2,ty2+420);//画女孩的腿
Line2D.DoubleLine5=newLine2D.Double(t3,ty3+350,t4,ty4+420);
Line2D.DoubleLine6=newLine2D.Double(t12,ty12+420,t22,ty22+420);
Line2D.DoubleLine7=newLine2D.Double(t31,ty31+420,t41,ty41+420);
g2.draw(Line2);
g2.draw(Line3);
g2.draw(Line4);
g2.draw(Line5);
g2.draw(Line6);
g2.draw(Line7);
intx1[]={x11,x12,x13};//画女孩的身体
inty1[]={y11+170,y12+350,y13+350};
GeneralPathpolygon=newGeneralPath(0,x1.length);
polygon.moveTo(x1[0],y1[0]);
for(intindex=1;index { polygon.lineTo(x1[index],y1[index]); } polygon.closePath(); g2.setPaint(newColor(20,200,240)); g2.draw(polygon); g2.fill(polygon); Ellipse2D.Doublee2=newEllipse2D.Double(0,0,100,70);//画太阳 g2.setPaint(Color.ORANGE); g2.fill(e2); Line2D.DoubleLine9=newLine2D.Double(110,40,190,25); g2.setPaint(Color.yellow); g2.draw(Line9); Line2D.DoubleLine10=newLine2D.Double(90,75,210,120); g2.draw(Line10); Line2D.DoubleLine11=newLine2D.Double(50,85,60,200); g2.draw(Line11); Line2D.DoubleLine12=newLine2D.Double(18,80,0,100); g2.draw(Line12); g2.setPaint(Color.white); Ellipse2D.Doublee3=newEllipse2D.Double(930,100,95,40);//画云 g2.fill(e3); Ellipse2D.Doublee4=newEllipse2D.Double(890,100,75,40); g2.fill(e4); /////////////////////////////////////////////////////////////////////////画男孩 g2.setStroke(newBasicStroke (2));//画男孩的脸 g2.setPaint(Color.YELLOW); Ellipse2D.Doublee11=newEllipse2D.Double(nx+1100,ny+100,70,70); g2.fill(e11); g2.setPaint(Color.black); g2.draw(e11); g2.setPaint(newColor(255,60,60));//画红脸蛋 Ellipse2D.Doublee211=newEllipse2D.Double(p+711,q-50,25,25);g2.fill(e211); g2.setPaint(Color.black); Line2D.DoubleLine1=newLine2D.Double(nx+1130,ny+170,nx+1130,ny+180);//画男孩的脖子 Line2D.DoubleLine21=newLine2D.Double(nx+1140,ny+170,nx+1140,ny+180); Line2D.DoubleLine31=newLine2D.Double(nx+995,ny+275,nx+1065,ny+180);//画男孩的手 Line2D.DoubleLine41=newLine2D.Double(nx+1205,ny+180,nx+1275,ny+275); Line2D.DoubleLine51=newLine2D.Double(nx+1100,ny+350,nx+1100,ny+420);//画男孩的腿 Line2D.DoubleLine61=newLine2D.Double(nx+1170,ny+350,nx+1170,ny+420); Line2D.DoubleLine71=newLine2D.Double(nx+1090,ny+420,nx+1100,ny+420); Line2D.DoubleLine81=newLine2D.Double(nx+1160,ny+420,nx+1170,ny+420); g2.draw(Line1); g2.draw(Line21); g2.draw(Line31); g2.draw(Line41); g2.draw(Line51); g2.draw(Line61); g2.draw(Line71); g2.draw(Line81); intx11[]={nx+1065,nx+1205,nx+1205,nx+1065};//画男孩的身体 inty11[]={ny+180,ny+180,ny+350,ny+350}; GeneralPathpolygon1=newGeneralPath(0,x11.length); polygon1.moveTo(x11[0],y11[0]); for(intindex=1;index { polygon1.lineTo(x11[index],y11[index]); } polygon1.closePath(); g2.setPaint(Color.MAGENTA); g2.draw(polygon1); g2.fill(polygon1); /////////////////////////////////////////////////////////////////////////画桃心 QuadCurve2D.DoubleLine122=newQuadCurve2D.Double(xx+510,xy-70,xx+527,xy-105,xx+565,xy-70); QuadCurve2D.DoubleLine22=newQuadCurve2D.Double(xx+510,xy-70,xx+510,xy-17,xx+565,xy-0); QuadCurve2D.DoubleLine32=newQuadCurve2D.Double(xx+565,xy-70,xx+603,xy-105,xx+620,xy-70); QuadCurve2D.DoubleLine42=newQuadCurve2D.Double(xx+620,xy-70,xx+620,xy-17,xx+565,xy-0); intx12[]={xx+510,xx+620,xx+565}; inty12[]={xy-70,xy-70,xy-0}; GeneralPathpolygon2=newGeneralPath(0,x12.length); polygon2.moveTo(x12[0],y12[0]); for(intindex=1;index { polygon2.lineTo(x12[index],y12[index]); } polygon2.closePath(); g2.setPaint(Color.red); g2.draw(Line122); g2.draw(Line22); g2.draw(Line32);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 多线程