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

上传人:李司机 文档编号:1143220 上传时间:2022-07-04 格式:DOC 页数:14 大小:59KB
返回 下载 相关 举报
实验2线程与同步解答.doc_第1页
第1页 / 共14页
实验2线程与同步解答.doc_第2页
第2页 / 共14页
实验2线程与同步解答.doc_第3页
第3页 / 共14页
实验2线程与同步解答.doc_第4页
第4页 / 共14页
实验2线程与同步解答.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《实验2线程与同步解答.doc》由会员分享,可在线阅读,更多相关《实验2线程与同步解答.doc(14页珍藏版)》请在三一办公上搜索。

1、word实验二 线程与同步一、实验目的1 理解线程的根本概念2 掌握Java中线程类与Runnable接口的应用3 掌握控制线程根本方法4 掌握Java中线程的同步与互斥的实现二、实验容1 验证课堂练习的结果,下面是课堂练习的容:(1) 编写一个程序,能够根据用户的输入的数值生成相应数目的线程,每个线程运行1秒后完毕。(2) 编写一个程序,能够生成n个线程,每个线程每隔1秒打印自己的序号,当用户输入m后第m个线程完毕。(3) 编写一个程序,能够生成n个线程,每个线程打印自己的序号后完毕,但要求最终的打印的结果为n,n1,1。2 将第三题改写为能够按照任意顺序完毕。3 编写一个程序由假如干个类组

2、成,该程序能够生成3个线程,其中2个线程向一个队列中写入数据,每次写入1个字节,1个线程从队列中读出数据,一次2个字节。要求读写交替运行,并注意数据的同步,而且队列要借助数组实现。三、实验步骤1 运行Eclipse,在其中新建一个Java工程JavaNetwork;2 创建package lab.lab2,并在其中创建一个Java类FirstThread并运行查看结果,其代码如下:package lab.lab2;import java.io.*;public class FirstThread extends Threadpublic static void main(String args

3、) int n;try n=Integer.parseInt(new BufferedReader(new InputStreamReader(System.in).readLine();for (int i=0;in;i+)(new FirstThread().start(); catch (IOException e) e.printStackTrace();public void run()System.out.println(Thread started.);try Thread.sleep(1000); catch (InterruptedException e) e.printSt

4、ackTrace();System.out.println(Thread ended.);运行该程序后,程序会等待用户的输入,如果用户输入:3结果将会是:Thread started.Thread started.Thread started.Thread ended.Thread ended.Thread ended.即程序会根据用户输入的数值来生成相应数目的线程,每个线程运行1秒后完毕。3 在package lab.lab2中创建一个Java类SecondThread并运行查看结果,其代码如下:package lab.lab2;import java.io.*;public class S

5、econdThread extends Threadprivate int id;private boolean flag=true;private static SecondThread t;private static int n=5;public SecondThread(int id)this.id=id;public void stopThread()flag=false;public boolean getThreadState()return flag;public static void main(String args) int m;t=new SecondThreadn;f

6、or (int i=0;in;i+)(ti=new SecondThread(i).start();while(testThreads()try m=Integer.parseInt(new BufferedReader(new InputStreamReader(System.in).readLine();tm.stopThread(); catch (IOException e) e.printStackTrace();System.out.println(program ended.);public void run()System.out.println(Thread +id+ sta

7、rted.);while (flag)try Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace();System.out.println(Thread +id+ ended.);private static boolean testThreads()boolean flag=false;for (int i=0;in;i+)flag|=ti.getThreadState();return flag;运行该程序后,屏幕将首先出现:Thread 0 started.Thread 1 started.Thread

8、 2 started.Thread 3 started.Thread 4 started.然后等待用户输入,如果这时用户依次输入0、3、2、1、4,屏幕将依次出现0Thread 0 ended.3Thread 3 ended.2Thread 2 ended.1Thread 1 ended.4program ended.Thread 4 ended.即程序会根据用户输入的数值来完毕相应序号的线程,所有线程完毕后程序完毕。4 在package lab.lab2中创建一个Java类ThirdRunnable并运行查看结果,其代码如下:package lab.lab2;public class Thi

9、rdRunnable implements Runnableprivate int id;private static int stopid=-1;static int n=10;public ThirdRunnable(int id)this.id=id;public static void main(String args) for (int i=1;i=n;i+)new Thread(new ThirdRunnable(i).start();stopid=n;public void run()System.out.println(Thread +id+ started.);while (

10、id!=stopid)Thread.yield();System.out.println(Thread +id+ ended.);stopid-;运行该程序后,屏幕将出现:Thread 1 started.Thread 2 started.Thread 3 started.Thread 4 started.Thread 5 started.Thread 6 started.Thread 7 started.Thread 8 started.Thread 9 started.Thread 10 started.Thread 10 ended.Thread 9 ended.Thread 8 end

11、ed.Thread 7 ended.Thread 6 ended.Thread 5 ended.Thread 4 ended.Thread 3 ended.Thread 2 ended.Thread 1 ended.即程序会根据按照正序启动10个线程,然后逆序完毕线程。5 将ThirdRunnable类改写,使其能够按照任意顺序完毕;下面是就是改写后的结果。package lab.lab2;public class FourthRunnable implements Runnable/线程按照下面熟组元素的顺序依次完毕。private static int t=4,5,9,3,1,0,2,6,

12、8,7;private int id;private static int stopid=0;public FourthRunnable(int id)this.id=id;public static void main(String args) for (int i=0;it.length;i+)(new Thread(new FourthRunnable(i).start();public void run()System.out.println(Thread +id+ started.);try Thread.sleep(2000); catch (InterruptedExceptio

13、n e) e.printStackTrace();while (id!=tstopid)Thread.yield();System.out.println(Thread +id+ ended.);stopid+;6 编写代码实现实验容中的第3题。四、调试分析在调试线程程序的过程中,并干扰到其它应用程序的正常运行,后来经过仔细观察,发现是因为在线程的循环体当中没有调用sleep语句,从而导致线程不断地抢占CPU,从而影响其它程序的正常运行。五、实验结果按照指导书的步骤完成了第1题和第2题,同时编写程序完成了第3题,达到了所要求的实验结果。第3题的源代码如下:/环形队列package lab.la

14、b2;public class DataQuque final int MAXLENGTH=10;byte data=new byteMAXLENGTH;int length;int startpos;int endpos;public int read()int b;if (length2)return -1;else if(startpos=MAXLENGTH-2)b=dataMAXLENGTH-2;b=b8;b|=dataMAXLENGTH-1;startpos=0;length-=2;return b;else if(startpos=MAXLENGTH-1)b=dataMAXLENG

15、TH-1;b=b8;b|=data0;length-=2;startpos=1;return b;elseb=datastartpos;b=b0) if (printcount!=tempcount)printcount=tempcount;/注意位置printResult();resetSenders();if (tempcount=total) break;public boolean setData(int id,int data)/新增数据if (datacountid=datanumid)return false;addData(id,data);return true;privat

16、e void addData(int id,int data)int temp=(int)datalist.get(id);tempdatacountid=data;datacountid+;count+;private void printResult()/打印结果for (int i=0;isenderId;i+)int data=(int )datalist.get(i);System.out.println(nn Data form sender +i+ : );for (int j=0;jdatanumi;j+)System.out.print(dataj+ );averagei+=

17、dataj;averagei/=datanumi;System.out.println(n Average : +averagei);private void resetSenders()/清空数据存储数组,准备接收下一组数据。for (int i=0;isenderId;i+)datacounti=0;/发送线程package thread.control;import java.util.Random;public class DataSender extends ThreadDataReciever dr;int id;int datasize; /求平均所需的数据数M或Nint max

18、length; /总共要发送的数据数M*TIMES或N*TIMESint count;public DataSender(DataReciever dr,int datasize,int maxlength) this.dr=dr;this.datasize=datasize;this.maxlength=maxlength;id=dr.connect(datasize,maxlength);/与接收线程连接,让接收线程为本发送线程建立数据传送通道标识,数据数组,每次发送的数据长度,所有数据数public void run() while (count maxlength) /数据超过最大数如

19、此完毕线程int data = 0xFF&generateData();/随机产生一个数据while (!dr.setData(id, data) /发送数据Thread.yield();System.out.print(+id+.);count+;private int generateData() Random r=new java.util.Random();return r.nextInt();/控制类(产生两个发送线程和一个接收线程。)package thread.control;public class DataMain public static void main(String

20、 args) final int TIMES=4;final int M=3,N=5;DataSender s1,s2;DataReciever r=new DataReciever();s1=new DataSender(r,M,M*TIMES);s2=new DataSender(r,N,N*TIMES);r.start();s1.start();s2.start();2 编写一个多线程程序,模拟多个售票点联网出售火车票的场景,假设车票有10,购票人有20人,售票点有3个,要求最终能够输出每车票的票号、售出地点、乘客。/乘客类package lab.lab2.ex2;public clas

21、s Person public int personid;public String name;public Person(int personid)this.personid=personid;/火车票类package lab.lab2.ex2;public class Ticket public int ticketno;public String description;public Ticket(int ticketno)this.ticketno=ticketno;/售票点类package lab.lab2.ex2;import java.util.*;public class Po

22、sition extends Threadint positionid;/售票点标识ArrayList personlist;/参加排队的乘客列表ArrayList ticketlist;/所有的火车票列表static boolean soldoutflag=false;/标记票是否售完public Position(int positionid,ArrayList ticketlist)this.positionid=positionid;this.ticketlist=ticketlist;personlist=new ArrayList();public void addPerson(P

23、erson p)/增加一个人排队personlist.add(p);public boolean sellTicket(Person p)/售票synchronized(ticketlist)if (soldoutflag) return false;Iterator it = ticketlist.iterator();Ticket t=null;if (it.hasNext()t = (Ticket) it.next();else System.out.println(Ticket is sold out.);soldoutflag=true;return false;if (t != n

24、ull) System.out.println(Ticket + t.ticketno + is sold to person +p.personid+ at position +positionid+.);it.remove(); return true;public void run()Iterator it=personlist.iterator();Person p;Random rnd = new Random(); while (it.hasNext()/按排队顺序售票p=(Person)it.next();if(!sellTicket(p)break;it.remove();tr

25、y sleep(Math.abs(rnd.nextInt()%4000); /随机产生的每次售票过程所需的时间 catch (InterruptedException e) e.printStackTrace();/控制类package lab.lab2.ex2;import java.util.*;public class TicketController public static void main(String args) int i;ArrayList ticketlist=new ArrayList();ArrayList personlist=new ArrayList();Ticket t;Position pos=new Position3;Person p;for (i=0;i10;i+)t=new Ticket(i);ticketlist.add(t);for (i=0;i3;i+)posi=new Position(i,ticketlist);for (i=0;i20;i+)/将20个乘客分散到3个售票点p=new Person(i);personlist.add(p);posi%3.addPerson(p);for (i=0;i3;i+)posi.start();14 / 14

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号