实验2:线程与同步(解答)_第1页
实验2:线程与同步(解答)_第2页
实验2:线程与同步(解答)_第3页
实验2:线程与同步(解答)_第4页
实验2:线程与同步(解答)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验二实验二 线程与同步线程与同步 一一 实实验验目目的的 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 lab lab2 并在其中创建一个 Java 类 FirstThread 并运行查看结果 其代码 如下 package lab lab2 import java io public class FirstThread extends Thread public static void main String args int n try n Integer parseInt new BufferedReader new InputStreamReader System in readLine for int i 0 i n 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 printStackTrace 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 SecondThread extends Thread private 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 SecondThread n for int i 0 i n i t i new SecondThread i start while testThreads try m Integer parseInt new BufferedReader new InputStreamReader System in readLine t m stopThread catch IOException e e printStackTrace System out println program ended public void run System out println Thread id started 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 i n i flag t i getThreadState return flag 运行该程序后 屏幕将首先出现 Thread 0 started Thread 1 started Thread 2 started Thread 3 started Thread 4 started 然后等待用户输入 如果这时用户依次输入 0 3 2 1 4 屏幕将依次出现 0 Thread 0 ended 3 Thread 3 ended 2 Thread 2 ended 1 Thread 1 ended 4 program ended Thread 4 ended 即程序会根据用户输入的数值来结束相应序号的线程 所有线程结束后程序结束 4 在 package lab lab2 中创建一个 Java 类 ThirdRunnable 并运行查看结果 其代码如下 package lab lab2 public class ThirdRunnable implements Runnable private 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 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 ended 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 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 i t length i new Thread new FourthRunnable i start public void run System out println Thread id started try Thread sleep 2000 catch InterruptedException e e printStackTrace while id t stopid Thread yield System out println Thread id ended stopid 6 编写代码实现实验内容中的第 3 题 四四 调调试试分分析析 在调试线程程序的过程中 并干扰到其它应用程序的正常运行 后来经过仔细观察 发现是因为在线程的循环体当中没有调用 sleep 语句 从而导致线程不断地抢占 CPU 从 而影响其它程序的正常运行 五五 实实验验结结果果 按照指导书的步骤完成了第 1 题和第 2 题 同时编写程序完成了第 3 题 达到了所要 求的实验结果 第 3 题的源代码如下 环形队列环形队列 package lab lab2 public class DataQuque final int MAXLENGTH 10 byte data new byte MAXLENGTH int length int startpos int endpos public int read int b if length 2 return 1 else if startpos MAXLENGTH 2 b data MAXLENGTH 2 b b 8 b data MAXLENGTH 1 startpos 0 length 2 return b else if startpos MAXLENGTH 1 b data MAXLENGTH 1 b b 8 b data 0 length 2 startpos 1 return b else b data startpos b b 0 if printcount tempcount printcount tempcount 注意位置注意位置 printResult resetSenders if tempcount total break public boolean setData int id int data 新增数据新增数据 if datacount id datanum id return false addData id data return true private void addData int id int data int temp int datalist get id temp datacount id data datacount id count private void printResult 打印结果打印结果 for int i 0 i senderId i int data int datalist get i System out println n n Data form sender i for int j 0 j datanum i j System out print data j average i data j average i datanum i System out println n Average average i private void resetSenders 清空数据存储数组 准备接收下一清空数据存储数组 准备接收下一 组数据 组数据 for int i 0 i senderId i datacount i 0 发送线程发送线程 package thread control import java util Random public class DataSender extends Thread DataReciever dr int id int datasize 求平均所需的数据数 求平均所需的数据数 M 或或 N int maxlength 总共要发送的数据数 总共要发送的数据数 M TIMES 或或 N TIMES int 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 数据超过最大数则结束线程数据超过最大数则结束线程 int data 0 xFF 随机产生一个数据随机产生一个数据 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 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 class 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 Position extends Thread int 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 Person 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 null System out println Ticket t ticketno is sold to p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论