java多线程实验报告.docx
《java多线程实验报告.docx》由会员分享,可在线阅读,更多相关《java多线程实验报告.docx(7页珍藏版)》请在冰豆网上搜索。
java多线程实验报告
java多线程实验报告
篇一:
西北农林科技大学java多线程实验报告
实验7多线程
1.实验目的
(1)掌握Java多线程的概念和实现方法
(2)掌握Java多线程的同步问题
2.实验内容
任务一:
火车售票
假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒买一张票。
打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。
程序运行结果见左图。
打开Eclipse
Tickets.java
publicclassTicketextendsThread{
intticket=1000;Stringname="";publicvoidrun(){while(true){synchronized(name){if(ticket "第"+Thread.currentThread().getName()+"售票点卖出了第"+ticket--+"张票");
}
}}
}}try{}catch(InterruptedExceptione){}Thread.sleep(100);
Test.java
publicclassTest{
}publicstaticvoidmain(Stringargs[]){}Tickett=newTicket();newThread(t,"1").start();newThread(t,"2").start();newThread(t,"3").start();newThread(t,"4").start();newThread(t,"5").start();newThread(t,"6").start();newThread(t,"7").start();newThread(t,"8").start();newThread(t,"9").start();newThread(t,"10").start();
任务二:
银行存款
假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。
现有两个顾客,每人都分3次,每次100元将钱到入。
试编写一个程序,模拟实际作业。
程序如下:
classCBank
{privatestaticintsum=0;
publicstaticvoidadd(intn){
inttmp=sum;
tmp=tmp+n;//累加汇款总额
try{
Thread.sleep((int)(10000*Math.random()));//小睡几秒钟
}
catch(InterruptedExceptione){}
sum=tmp;
"sum="+sum);
}
}
classCCustomerextendsThread//CCustomer类,继承自Thread类
{publicvoidrun(){//run()method
for(inti=1;i CBank.add(100);//将100元分三次汇入
}
}
publicclassEx7_1
{publicstaticvoidmain(Stringargs[])
{CCustomerc1=newCCustomer();
CCustomerc2=newCCustomer();
c1.start();c2.start();
}
}
[基本要求]运行程序5次,观察每次运行结果是否相同。
[思考问题]运行结果每次是否相同,运行时间是否相同,为什么?
①要使程序运行结果每次相同,应该怎样修改程序?
②程序中为什么要使用异常处理?
答:
运行程序5次,观察每次运行结果不相同:
运行结果每次是否相同,运行时间不相同,因为程序不同步。
①为了使程序运行结果每次相同,程序修改如下:
CBank.java
classCBank
{privatestaticintsum=0;
publicsynchronizedstaticvoidadd(intn){
inttmp=sum;
tmp=tmp+n;//累加汇款总额
try{
Thread.sleep((int)(10000*Math.random()));//小睡几秒钟}
catch(InterruptedExceptione){}
sum=tmp;
"sum="+sum);
}
}
CCustomer.java
classCCustomerextendsThread//CCustomer类,继承自Thread类
{publicvoidrun(){//run()method
for(inti=1;i CBank.add(100);//将100元分三次汇入
}
}
Ex7_1.java
publicclassEx7_1
{publicstaticvoidmain(Stringargs[])
{CCustomerc1=newCCustomer();
CCustomerc2=newCCustomer();
c1.start();
c2.start();
}
}
运行结果如下:
②程序中为什么要使用异常处理?
程序执行时经常会出现除零溢出、数组越界等运行错误,影响程序的正常执行。
Java语言通过面向对象的异常处理机制来解决运行期间的错误,可以预防错误的程序代码或系统错误所造成的不可预期的结果发生。
减少编程人员的工作,增加了程序的灵活性,增加程序的可读性和健壮性.
任务三:
生产者和消费者问题
生产者生产面包,消费者消费面包,“生产”和“消费”各代表一个进程,当生产者没有生产出面包的时候,消费者不能消费面包。
当消费者没有消费完面包的时候,生产者不能再生产。
程序效果如下:
程序要求:
一次生产5个面包,一次消费5个面包。
注同步机制,wait()方法,notify()方法的使用。
启动Eclipse:
程序代码如下:
Bread.java
publicclassBreadimplementsRunnable{
intsum=0;Bread(intn){sum=n;}voidpro(){while(sum "个");
}
"生产完毕。
");
"开始消费--");
notifyAll();
}
voidcon(){
if(sum "还没有生产出面包,等待中--");try{wait();}catch(InterruptedExceptione){}for(inti=0;i "消费完毕。
");}
publicsynchronizedvoidbread(intk){}publicvoidrun(){if(Thread.currentThread().getName().equals("produce")){"启动消费");bread(-1);if(k==1){}con();pro();if(k==-1){}}if(Thread.currentThread().getName().equals("consume")){"开始生产--");bread
(1);}}}
Wt.java
publicclassWt{
publicstaticvoidmain(Stringargs[]){
Breadbread=newBread(0);Threadthread1=newThread(bread);Threadthread2=newThread(bread);thread1.setName("produce");
篇二:
Java多线程实验报告
实验4:
Java多线程
实验时间:
实验地点:
一、实验目的及要求
(1)了解线程的概念。
(2)学习简单的多线程编程。
二、实验设备环境及要求
三、实验任务
(1)阅读给定的JavaApplication程序,按要求回答问题并写出运行结果。
(2)按要求编写一个JavaApplication程序,并编译、运行这个程序。
四、实验内容与步骤
1.输入下面的JavaApplication程序,运行该程序,并简要分析程序的运行结果。
1:
classSimpleThreadextendsThread{
2:
publicSimpleThread(Stringstr){
3:
super(str);//调用其父类的构造方法
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14(本文来自:
小草范文网:
java多线程实验报告):
15:
16:
17:
18:
}}publicvoidrun(){//重写run方法for(inti=0;i 1:
publicclassTwoThreadsTest{
2:
publicstaticvoidmain(Stringargs[]){
3:
newSimpleThread("First").start();
4:
//第一个线程的名字为First
5:
newSimpleThread("Second").start();
6:
//第二个线程的名字为Second
7:
8:
}
}
2.编写程序,将上面多线程程序用Runnable接口来实现。
classSimpleThreadimplementsRunnable{
publicvoidrun(){
for(inti=0;i +""+Thread.currentThread().getName());try{
Thread.sleep((int)(Math.random()*1000));
//线程睡眠,把控制权交出去
}
catch(InterruptedExceptione){}
}
"DONE!
"+Thread.currentThread().getName());//线程执行结束
}
}
publicclassTest{
publicstaticvoidmain(Stringargs[]){
/*Threadt1=newThread("First");
//第一个线程的名字为First
Threadt2=newThread("Second");
//第二个线程的名字为Second
t1.start();
t2.start();*/
newThread(newSimpleThread(),"First").start();
newThread(newSimpleThread(),"Second").start()
}
}
篇三:
java线程实验报告—反弹球
《Java程序设计》实验报告
班级:
学号:
姓名:
1.题目
(一).编写Applet程序,其中包含一个滚动的字符串,字符串从左到右运动,当所有的字符都从屏幕的右边消失后,字符串重新从左边出现并继续向右移动。
(二).编写一个Applet内部显示一个蓝色反弹球的程序,通过一个事件使该球开始运动,在该球撞击Applet边框时,它应从边框弹回并以相反的方向运动。
2.目的和要求
(1)掌握实现线程有两种方法:
1.实现Ruannable接口2.继承Thread类
(2)学会线程的创建,run()方法的调用,在stop()方法中终止线程。
3.源程序
实验
(二)源程序:
importjava.awt.*;importjava.applet.*;
publicclassextendsAppletimplementsRunnable{
intX,Y;
publicThread2(){}
Threadm_Draw=null;
publicvoidinit(){
m_Draw=newThread(this);}
publicvoidpaint(Graphicsg){
g.setColor(Color.pink);g.fillOval(X,Y,20,20);
}
publicvoidstart(){
m_Draw.start();try{
Thread.sleep(50);
}catch(InterruptedExceptione){}}
publicvoidstop(){
if(m_Draw.isAlive())m_Draw}
publicvoidrun(){
intdx=(int)(Math.random()*10)%2+3;intdy=(int)(Math.random()*10)%2+3;try{
while(true){
X=X+dx;Y=Y+dy;
}
if(Y>getHeight()-40||Y if(X>getWidth()-40||X Thread.sleep(100);}
}catch(InterruptedExceptione){}}
4.数据结果
实验
(一)结果:
实验
(二)数据:
5.实验心得与体会