实验2线程与同步解答.docx

上传人:b****8 文档编号:9378447 上传时间:2023-02-04 格式:DOCX 页数:10 大小:16.59KB
下载 相关 举报
实验2线程与同步解答.docx_第1页
第1页 / 共10页
实验2线程与同步解答.docx_第2页
第2页 / 共10页
实验2线程与同步解答.docx_第3页
第3页 / 共10页
实验2线程与同步解答.docx_第4页
第4页 / 共10页
实验2线程与同步解答.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

实验2线程与同步解答.docx

《实验2线程与同步解答.docx》由会员分享,可在线阅读,更多相关《实验2线程与同步解答.docx(10页珍藏版)》请在冰豆网上搜索。

实验2线程与同步解答.docx

实验2线程与同步解答

实验二线程与同步

一、实验目的

1.理解线程的基本概念

2.掌握Java中线程类与Runnable接口的应用

3.掌握控制线程基本方法

4.掌握Java中线程的同步与互斥的实现

二、实验内容

1.验证课堂练习的结果,下面是课堂练习的内容:

(1)编写一个程序,能够根据用户的输入的数值生成相应数目的线程,每个线程运行1秒后结束。

(2)编写一个程序,能够生成n个线程,每个线程每隔1秒打印自己的序号,当用户输入m后第m个线程结束。

(3)编写一个程序,能够生成n个线程,每个线程打印自己的序号后结束,但要求最终的打印的结果为n,n-1,……1。

2.将第三题改写为能够按照任意顺序结束。

3.编写一个程序(由若干个类组成),该程序能够生成3个线程,其中2个线程向一个队列中写入数据,每次写入1个字节,1个线程从队列中读出数据,一次2个字节。

要求读写交替运行,并注意数据的同步,而且队列要借助数组实现。

三、实验步骤

1.运行Eclipse,在其中新建一个Java工程JavaNetwork;

2.创建package,并在其中创建一个Java类FirstThread并运行查看结果,其代码如下:

package;

import.*;

publicclassFirstThreadextendsThread{

publicstaticvoidmain(String[]args){

intn;

try{

n=((newBufferedReader(newInputStreamReader)).readLine());

for(inti=0;i

(newFirstThread()).start();

}

}catch(IOExceptione){

();

}

}

publicvoidrun(){

"Threadstarted....");

try{

(1000);

}catch(InterruptedExceptione){

();

}

"Threadended.");

}

}

运行该程序后,程序会等待用户的输入,如果用户输入:

3

结果将会是:

Threadstarted....

Threadstarted....

Threadstarted....

Threadended.

Threadended.

Threadended.

即程序会根据用户输入的数值来生成相应数目的线程,每个线程运行1秒后结束。

3.在package中创建一个Java类SecondThread并运行查看结果,其代码如下:

package;

import.*;

publicclassSecondThreadextendsThread{

privateintid;

privatebooleanflag=true;

privatestaticSecondThreadt[];

privatestaticintn=5;

publicSecondThread(intid){

=id;

}

publicvoidstopThread(){

flag=false;

}

publicbooleangetThreadState(){

returnflag;

}

publicstaticvoidmain(String[]args){

intm;

t=newSecondThread[n];

for(inti=0;i

(t[i]=newSecondThread(i)).start();

}

while(testThreads()){

try{

m=((newBufferedReader(

newInputStreamReader)).readLine());t[m].stopThread();

}catch(IOExceptione){

();

}

}

"programended.");

}

publicvoidrun(){

"Thread"+id+"started....");

while(flag){

try{

(1000);

}catch(InterruptedExceptione){

();

}

}

"Thread"+id+"ended.");

}

privatestaticbooleantestThreads(){

booleanflag=false;

for(inti=0;i

flag|=t[i].getThreadState();

}

returnflag;

}

}

运行该程序后,屏幕将首先出现:

Thread0started....

Thread1started....

Thread2started....

Thread3started....

Thread4started....

然后等待用户输入,如果这时用户依次输入0、3、2、1、4,屏幕将依次出现

0

Thread0ended.

3

Thread3ended.

2

Thread2ended.

1

Thread1ended.

4

programended.

Thread4ended.

即程序会根据用户输入的数值来结束相应序号的线程,所有线程结束后程序结束。

4.在package中创建一个Java类ThirdRunnable并运行查看结果,其代码如下:

package;

publicclassThirdRunnableimplementsRunnable{

privateintid;

privatestaticintstopid=-1;

staticintn=10;

publicThirdRunnable(intid){

=id;

}

publicstaticvoidmain(String[]args){

for(inti=1;i<=n;i++){

newThread(newThirdRunnable(i)).start();

}

stopid=n;

}

publicvoidrun(){

"Thread"+id+"started....");

while(id!

=stopid){

();

}

"Thread"+id+"ended.");

stopid--;

}

}

运行该程序后,屏幕将出现:

Thread1started....

Thread2started....

Thread3started....

Thread4started....

Thread5started....

Thread6started....

Thread7started....

Thread8started....

Thread9started....

Thread10started....

Thread10ended.

Thread9ended.

Thread8ended.

Thread7ended.

Thread6ended.

Thread5ended.

Thread4ended.

Thread3ended.

Thread2ended.

Thread1ended.

即程序会根据按照正序启动10个线程,然后逆序结束线程。

5.将ThirdRunnable类改写,使其能够按照任意顺序结束;

下面是就是改写后的结果。

package;

publicclassFourthRunnableimplementsRunnable{

tart();

}

}

publicvoidrun(){

"Thread"+id+"started....");

try{

(2000);

}catch(InterruptedExceptione){

();

}

while(id!

=t[stopid]){

();

}

"Thread"+id+"ended.");

stopid++;

}

}

6.编写代码实现实验内容中的第3题。

四、调试分析

在调试线程程序的过程中,并干扰到其它应用程序的正常运行,后来经过仔细观察,发现是因为在线程的循环体当中没有调用sleep语句,从而导致线程不断地抢占CPU,从而影响其它程序的正常运行。

五、实验结果

按照指导书的步骤完成了第1题和第2题,同时编写程序完成了第3题,达到了所要求的实验结果。

第3题的源代码如下:

;

publicclassDataRecieverextendsThread{

ArrayListdatalist=newArrayList();

finalintMAX=10;"+data+">.");

count++;

}

}

privateintgenerateData(){

Randomr=new

return();

}

}

;

publicclassPositionextendsThread{

intpositionid;;

soldoutflag=true;

returnfalse;

}

if(t!

=null){

"Ticket"++

"issoldtoperson"++

"atposition"+positionid+".");

();

}

returntrue;

}

}

publicvoidrun(){

Iteratorit=();

Personp;

Randomrnd=newRandom();

while()){;

publicclassTicketController{

publicstaticvoidmain(String[]args){

inti;

ArrayListticketlist=newArrayList();

ArrayListpersonlist=newArrayList();

Tickett;

Positionpos[]=newPosition[3];

Personp;

for(i=0;i<10;i++){

t=newTicket(i);

(t);

}

for(i=0;i<3;i++){

pos[i]=newPosition(i,ticketlist);

}

for(i=0;i<20;i++){ddPerson(p);

}

for(i=0;i<3;i++){

pos[i].start();

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1