实验3java开发环境.docx
- 文档编号:10871037
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:15
- 大小:195.75KB
实验3java开发环境.docx
《实验3java开发环境.docx》由会员分享,可在线阅读,更多相关《实验3java开发环境.docx(15页珍藏版)》请在冰豆网上搜索。
实验3java开发环境
南京工程学院
实验报告
程序设计语言-JAVA
开课院系:
经济管理学院
开课学期:
2009-2010-2
实验:
(三)
班级:
K信管081
学生姓名:
孟凡
学号:
240083811
JAVA语言课程实验报告
实验3:
java开发环境
一、实验目的及要求
熟悉JDK环境,掌握Jcreator的使用方法,理解Java应用程序的运行原理
和方法。
二、实验设备(环境)及要求
JDK;Jcreator;
Windows操作系统
三、实验内容与步骤
①实验内容:
(一)、两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。
另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
更改下列程序,去掉synchronized(this),观察去掉前后的运行结果,并说明结果反映的问题。
publicclassThread1implementsRunnable{
publicvoidrun(){
synchronized(this)
{
for(inti=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"synchronizedloop"+i);
}
}
}
publicstaticvoidmain(String[]args){
Thread1t1=newThread1();
Threadta=newThread(t1,"A");
Threadtb=newThread(t1,"B");
ta.start();
tb.start();
}
}
(二):
观察试验:
回答问题。
写出一组模拟生产者/消费者的协作程序
其中包括一个WoTou.java,代表消息
一个MsgQueue.java,为一个队列,提供put(Messagemsg)方法和get()方法
一个Produer.java,为生产者线程,在其run方法中每隔1秒产生一个Message对像并放入MsgQueue队列
一个Consumer.java为消费者线程,在其run方法中不断从MsgQueue队列中获取Message对像,并显示在屏幕上
一个TestMain.java,在其main方法中,启动2个Produer线程和2个消费者线程.
要求:
对于MsgQueue.java,队列的长度为10,当消息超过10个时,put()方法需要阻塞:
当消息队列为空时,
get()方法需要阻塞。
publicclassProducerConsumer{
publicstaticvoidmain(String[]args){
SyncStackss=newSyncStack();
Producerp1=newProducer(ss,"p1");
Consumerc1=newConsumer(ss,"c1");
Producerp2=newProducer(ss,"p2");
Consumerc2=newConsumer(ss,"c2");
}
}
classWoTou
intid;
WoTou(intid){
this.id=id;
}
publicStringtoString(){
return"WoTou:
"+id;
}
}
classSyncStack{
intindex=0;
WoTou[]arrWT=newWoTou[6];
publicvoidpush(WoTouwt){
while(index==arrWT.length){
try{
this.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
this.notifyAll();
arrWT[index]=wt;
index++;
}
publicWoToupop(){
while(index==0){
try{
this.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
this.notifyAll();
index--;
returnarrWT[index];
}
}
classProducerimplementsRunnable{
SyncStackss=null;
Stringa;
Producer(SyncStackss,Stringa){
this.ss=ss;
this.a=a;
Threadt=newThread(this,a);
t.start();
}
publicvoidrun(){
for(inti=0;i<10;i++){
synchronized(ss){
WoTouwt=newWoTou(i);
ss.push(wt);
System.out.println(a+"生产了:
"+wt);}
try{
Thread.sleep((int)(Math.random()*200));
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
classConsumerimplementsRunnable{
SyncStackss=null;
Stringa;
Threadt;
Consumer(SyncStackss,Stringa){
this.ss=ss;
this.a=a;
t=newThread(this,a);
t.start();
}
publicvoidrun(){
for(inti=0;i<10;i++){
synchronized(ss){
WoTouwt=ss.pop();
System.out.println(a+"消费了:
"+wt);}
try{
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
p1生产了:
WoTou:
0
p2生产了:
WoTou:
0
p3生产了:
WoTou:
0
c1消费了:
WoTou:
0
c1消费了:
WoTou:
0
p3生产了:
WoTou:
1
c1消费了:
WoTou:
1
c1消费了:
WoTou:
0
p3生产了:
WoTou:
2
p1生产了:
WoTou:
1
c1消费了:
WoTou:
1
p2生产了:
WoTou:
1
p2生产了:
WoTou:
2
c1消费了:
WoTou:
2
p2生产了:
WoTou:
3
p3生产了:
WoTou:
3
c1消费了:
WoTou:
3
p3生产了:
WoTou:
4
p2生产了:
WoTou:
4
c1消费了:
WoTou:
4
c1消费了:
WoTou:
4
p1生产了:
WoTou:
2
c1消费了:
WoTou:
2
p2生产了:
WoTou:
5
p3生产了:
WoTou:
5
p2生产了:
WoTou:
6
栈里有6个
作为多线程交互一的一个重要应用,定义用户输入和输出的列队类或者堆栈类一定要看成一个整体放进同步语句块里面,不能简单的分别调用输入同步方法或者输出同步方法。
下面的程序就有问题下面这个是一个教程例子,但是结果不对。
究其原因实际上是因为列队类或者堆栈类是一个可变类,这种可变类要是有参数传递给某些不可变类时,可变类的构造方法必须也设置成为同步方法,不然就会出错。
publicclassProducerConsumer{
publicstaticvoidmain(String[]args){
SyncStackss=newSyncStack();
Producerp=newProducer(ss);
Consumerc=newConsumer(ss);
newThread(p).start();
newThread(p).start();
newThread(p).start();
newThread(c).start();
}
}
classWoTou{
intid;
WoTou(intid){
this.id=id;
}
publicStringtoString(){
return"WoTou:
"+id;
}
}
classSyncStack{
intindex=0;
WoTou[]arrWT=newWoTou[6];
publicsynchronizedvoidpush(WoTouwt){
while(index==arrWT.length){
try{
this.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
this.notifyAll();
arrWT[index]=wt;
index++;
}
publicsynchronizedWoToupop(){
while(index==0){
try{
this.wait();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
this.notifyAll();
index--;
returnarrWT[index];
}
}
classProducerimplementsRunnable{
SyncStackss=null;
Producer(SyncStackss){
this.ss=ss;
}
publicvoidrun(){
for(inti=0;i<20;i++){
WoTouwt=newWoTou(i);
ss.push(wt);
System.out.println("生产了:
"+wt);
try{
Thread.sleep((int)(Math.random()*200));
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
classConsumerimplementsRunnable{
SyncStackss=null;
Consumer(SyncStackss){
this.ss=ss;
}
publicvoidrun(){
for(inti=0;i<20;i++){
WoTouwt=ss.pop();
System.out.println("消费了:
"+wt);
try{
Thread.sleep((int)(Math.random()*1000));
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
(三):
编写一个继承thread类的类,然后实例化两个线程,并分别启动它们,并输出结果。
②步骤:
打开java程序;编写代码;运行代码;修改保存
四、实验结果(源程序)与数据处理(程序运行结果、截图等)
1、代码显示结果截图
更改下列程序,去掉
synchronized(this),出现的报错,但能运行,截图如下:
观察去掉前后的运行结果,并说明结果反映的问题
2、实验截图
结果原因分析:
3、编写一个继承thread类的类,然后实例化两个线程,并分别启动它们,并输出结果。
publicclassNumberThreadextendsThread
{
privateintk;//序列初始值
publicNumberThread(Stringname,intk)
{
super(name);
this.k=k;
}
publicNumberThread(Stringname)
{
this(name,0);
}
publicvoidrun()//覆盖run方法的线程体
{
inti=k;
System.out.print("\n"+this.getName()+":
");
while(i<50)
{
System.out.print(i+"");
i+=2;
}
System.out.println(this.getName()+"结束!
");
}
publicstaticvoidmain(Stringargs[])
{
NumberThreadthread_odd=newNumberThread("奇数线程",1);//创建线程对象
NumberThreadthread_even=newNumberThread("偶数线程",2);
//thread_odd.setPriority(10);//设置优先级为最高
thread_odd.start();//启动线程对象
thread_even.start();
System.out.println("currentThread="+Thread.currentThread().getName());//获得当前线程对象名
System.out.println("activeCount="+thread_even.activeCount());
System.out.println("mainPriority="+Thread.currentThread().getPriority());//获得当前线程对象的优先级
}
}
/*
程序运行结果如下:
currentThread=main
activeCount=3
mainPriority=5
奇数线程:
13579111315171921232527
偶数线程:
246810121416182022242628303234
36384042444648偶数线程结束!
2931333537394143454749奇数线程结束!
再次运行
thread_odd.setPriority(10);//最高优先级
奇数线程:
135791113151719212325272931333537
394143454749奇数线程结束!
activeCount=2
偶数线程:
246810121416182022242628303234
36384042444648偶数线程结束!
再次运行
thread_odd.setPriority
(1);//最低优先级
activeCount=3
偶数线程:
246810121416182022242628303234
36384042444648偶数线程结束!
奇数线程:
135791113151719212325272931333537
394143454749奇数线程结束!
*/
截图如下:
五、试验中遇到的问题、分析与讨论(手写)
评定成绩:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 java 开发 环境