实验6:多线程实验 (1)
线程实验报告

线程实验报告线程实验报告引言:线程是计算机科学中的一个重要概念,它是操作系统能够进行运算调度的最小单位。
线程的使用能够提高程序的并发性和响应性,使得程序能够更高效地利用计算机资源。
本次实验旨在通过编写一个简单的多线程程序,来探究线程的工作原理和应用。
实验目的:1. 了解线程的基本概念和特点;2. 掌握线程的创建、同步和销毁方法;3. 理解多线程编程的优势和挑战。
实验过程:1. 创建线程在实验开始时,我们首先需要创建线程。
在C++中,可以使用pthread库来实现。
通过调用pthread_create函数,我们可以创建一个新的线程,并将其与指定的函数进行绑定。
在实验中,我们创建了两个线程,分别执行不同的任务。
2. 线程同步在多线程编程中,线程之间的同步是一个重要的问题。
为了避免竞态条件和资源争用,我们需要使用互斥锁和条件变量等同步机制。
在本次实验中,我们使用了互斥锁来保护共享资源的访问,以及条件变量来实现线程之间的通信。
3. 线程销毁线程的销毁是一个关键的步骤。
在实验中,我们使用了pthread_join函数来等待线程的结束,并回收线程的资源。
这样可以确保线程的正确退出,避免资源泄漏和程序崩溃。
实验结果:通过实验,我们发现多线程编程具有以下优势:1. 提高程序的并发性:通过并行执行多个任务,可以提高程序的运行效率,减少等待时间。
2. 增强程序的响应性:多线程可以使程序具有更好的交互性,用户可以在任务执行的同时进行其他操作。
3. 充分利用计算机资源:多线程能够充分利用多核处理器的计算能力,提高系统的整体性能。
然而,多线程编程也存在一些挑战:1. 竞态条件:当多个线程同时访问共享资源时,可能会导致数据的不一致性和程序的错误。
2. 死锁和饥饿:线程之间的同步问题可能导致死锁和饥饿现象,使得程序无法正常执行。
3. 调试困难:多线程程序的调试比单线程程序更加困难,需要仔细分析线程之间的交互关系。
结论:通过本次实验,我们深入了解了线程的工作原理和应用。
模拟多线程实验报告

一、实验目的1. 理解多线程的概念及其在程序设计中的应用。
2. 掌握Java中创建和管理线程的方法。
3. 学习线程同步和互斥机制,解决线程间竞争条件。
4. 熟悉线程的调度和执行过程。
二、实验环境硬件:PC机软件:Java JDK 1.8、Eclipse/IntelliJ IDEA等IDE三、实验内容1. 实现一个简单的多线程程序,模拟多个线程同时执行任务。
2. 创建线程池,提高程序执行效率。
3. 实现线程同步,解决线程间竞争条件。
4. 学习线程通信机制,实现线程间的协作。
四、实验步骤1. 创建一个名为`MultiThreadDemo`的Java类,定义一个`run()`方法,用于执行线程任务。
```javapublic class MultiThreadDemo implements Runnable {@Overridepublic void run() {// 执行线程任务System.out.println(Thread.currentThread().getName() + "开始执行任务");// 模拟耗时操作try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "任务执行完毕");}}```2. 创建一个名为`Main`的类,在该类中创建多个线程,并启动它们。
```javapublic class Main {public static void main(String[] args) {// 创建线程Thread t1 = new Thread(new MultiThreadDemo(), "线程1");Thread t2 = new Thread(new MultiThreadDemo(), "线程2");Thread t3 = new Thread(new MultiThreadDemo(), "线程3");// 启动线程t1.start();t2.start();t3.start();}}```3. 创建线程池,并提交任务给线程池执行。
C#多线程编程实战(一):线程基础

C#多线程编程实战(⼀):线程基础1.1 简介为了防⽌⼀个应⽤程序控制CPU⽽导致其他应⽤程序和操作系统本⾝永远被挂起这⼀可能情况,操作系统不得不使⽤某种⽅式将物理计算分割为⼀些虚拟的进程,并给予每个执⾏程序⼀定量的计算能⼒。
此外操作系统必须始终能够优先访问CPU,并能调整不同程序访问CPU的优先级。
线程正式这⼀慨念的实现。
多线程优点:可以同时执⾏多个计算任务,有可能提⾼计算机的处理能⼒,使得计算机每秒能执⾏越来越多的命令多线程缺点:消耗⼤量的操作系统资源。
多个线程共享⼀个处理器将导致操作系统忙于管理这些线程,⽽⽆法运⾏程序。
1.2 创建线程using System;using System.Threading;namespace MulityThreadNote{class Program{static void Main(string[] args){Thread t1 = new Thread(new ThreadStart(PrintNumbers));//⽆参数的委托t1.Start();Thread t2 = new Thread(new ParameterizedThreadStart(PrintNumbers));//有参数的委托t2.Start(10);Console.ReadLine();}static void PrintNumbers(){Console.WriteLine("Starting...");for (int i = 0; i < 10; i++){Console.WriteLine(i);}}//注意:要使⽤ParameterizedThreadStart,定义的参数必须为objectstatic void PrintNumbers(object count){Console.WriteLine("Starting...");for (int i = 0; i < Convert.ToInt32(count); i++){Console.WriteLine(i);}}}}注释:我们只需指定在不同线程运⾏的⽅法名,⽽C#编译器会在后台创建这些对象1.3 暂停线程using System;using System.Threading;namespace MulityThreadNote{class Program{static void Main(string[] args){Thread t1 = new Thread(PrintNumbersWithDelay);t1.Start();PrintNumbers();Console.ReadLine();}static void PrintNumbers(){Console.WriteLine("Starting...");for (int i = 0; i < 10; i++){Console.WriteLine(i);}}static void PrintNumbersWithDelay(){Console.WriteLine("Starting...");for (int i = 0; i < 10; i++){Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine(i);}}}}注释:使⽤Thread.Sleep(TimeSpan.FromSeconds(2));暂停线程1.4 线程等待using System;namespace MulityThreadNote{class Program{static void Main(string[] args){Console.WriteLine("Starting...");Thread t = new Thread(PrintNumbersWithDelay);t.Start();t.Join(); //使⽤Join等待t完成PrintNumbers();Console.WriteLine("THread Complete");Console.ReadLine();}static void PrintNumbers(){Console.WriteLine("Starting...");for (int i = 0; i < 10; i++){Console.WriteLine(i);}}static void PrintNumbersWithDelay(){Console.WriteLine("Starting...");for (int i = 0; i < 10; i++){Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine(i);}}}}注释:使⽤t.Join(); 等待t完成1.5 终⽌线程using System;using System.Threading;namespace MulityThreadNote{class Program{static void Main(string[] args){Console.WriteLine("Starting Program...");Thread t1 = new Thread(PrintNumbersWithDelay);t1.Start();Thread.Sleep(TimeSpan.FromSeconds(6));t1.Abort(); //使⽤Abort()终⽌线程Console.WriteLine("Thread t1 has been aborted");Thread t2 = new Thread(PrintNumbers);PrintNumbers();Console.ReadLine();}static void PrintNumbers(){Console.WriteLine("Starting...");for (int i = 0; i < 10; i++){Console.WriteLine(i);}}static void PrintNumbersWithDelay(){Console.WriteLine("Starting...");for (int i = 0; i < 10; i++){Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine(i);}}}}注释:使⽤Thread实例的Abort⽅法终⽌线程1.6 检测线程状态using System;using System.Threading;namespace MulityThreadNote{class Program{static void Main(string[] args){Console.WriteLine("Start Program...");Thread t1 = new Thread(PrintNumbersWithStatus);Thread t2 = new Thread(DoNothing);Console.WriteLine(t1.ThreadState.ToString());//获取实例线程状态 t2.Start();t1.Start();for (int i = 0; i < 30; i++)}Thread.Sleep(TimeSpan.FromSeconds(6));t1.Abort();Console.WriteLine("thread t1 has been aborted");Console.WriteLine(t1.ThreadState.ToString());Console.WriteLine(t2.ThreadState.ToString());Console.ReadLine();}private static void PrintNumbersWithStatus(){Console.WriteLine("Starting...");Console.WriteLine(Thread.CurrentThread.ThreadState.ToString());//获取当前线程状态for (int i = 0; i < 10; i++){Thread.Sleep(TimeSpan.FromSeconds(2));Console.WriteLine(i);}}private static void DoNothing(){Thread.Sleep(TimeSpan.FromSeconds(2));}}}注释:使⽤Thread.ThreadState获取线程的运⾏状态。
多线程程序实验报告(3篇)

第1篇一、实验目的1. 理解多线程的概念和作用。
2. 掌握多线程的创建、同步和通信方法。
3. 熟悉Java中多线程的实现方式。
4. 提高程序设计能力和实际应用能力。
二、实验环境1. 操作系统:Windows 102. 开发工具:IntelliJ IDEA3. 编程语言:Java三、实验内容本次实验主要完成以下任务:1. 创建多线程程序,实现两个线程分别执行不同的任务。
2. 使用同步方法实现线程间的同步。
3. 使用线程通信机制实现线程间的协作。
四、实验步骤1. 创建两个线程类,分别为Thread1和Thread2。
```javapublic class Thread1 extends Thread {@Overridepublic void run() {// 执行Thread1的任务for (int i = 0; i < 10; i++) {System.out.println("Thread1: " + i);}}}public class Thread2 extends Thread {@Overridepublic void run() {// 执行Thread2的任务for (int i = 0; i < 10; i++) {System.out.println("Thread2: " + i);}}}```2. 创建一个主类,在主类中创建两个线程对象,并启动它们。
```javapublic class Main {public static void main(String[] args) {Thread thread1 = new Thread1();Thread thread2 = new Thread2();thread1.start();thread2.start();}```3. 使用同步方法实现线程间的同步。
```javapublic class SynchronizedThread extends Thread {private static int count = 0;@Overridepublic void run() {for (int i = 0; i < 10; i++) {synchronized (SynchronizedThread.class) {count++;System.out.println(Thread.currentThread().getName() + ": " + count);}}}}public class Main {public static void main(String[] args) {Thread thread1 = new SynchronizedThread();Thread thread2 = new SynchronizedThread();thread1.start();thread2.start();}```4. 使用线程通信机制实现线程间的协作。
【实验】java多线程实验报告

【关键字】实验java多线程实验报告篇一:西北农林科技大学java多线程实验报告实验7 多线程1.实验目的(1) 掌握Java多线程的概念和实现方法(2) 掌握Java多线程的同步问题2.实验内容任务一:火车售票假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒买一张票。
打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。
程序运行结果见左图。
打开EclipseTickets.javapublic class Ticket extends Thread {int ticket =1000; String name =""; public void run(){ while(true){synchronized(name){ if(ticket"第" + Thread.currentThread().getName()+ "售票点卖出了第" + ticket-- + "张票");}} }}} try{ } catch(InterruptedException e){ } Thread.sleep(100);Test.javapublic class Test {} public static void main(String args[]){} Ticket t = new Ticket(); new Thread(t,"1").start(); new Thread(t,"2").start(); new Thread(t,"3").start(); new Thread(t,"4").start(); new Thread(t,"5").start(); new Thread(t,"6").start(); new Thread(t,"7").start(); new Thread(t,"8").start(); new Thread(t,"9").start(); new Thread(t,"10").start();任务二:银行存款假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。
java多线程的实验报告

java多线程的实验报告Java多线程的实验报告一、引言多线程是计算机科学中一个重要的概念,它可以提高程序的并发性和效率。
Java作为一种广泛应用的编程语言,也提供了丰富的多线程支持。
本实验旨在通过编写多线程程序,探索Java多线程的特性和使用方法。
二、实验目的1. 理解多线程的概念和原理;2. 掌握Java多线程的基本使用方法;3. 分析多线程程序的执行过程和效果。
三、实验过程1. 创建多线程在Java中,可以通过继承Thread类或实现Runnable接口来创建多线程。
本实验选择实现Runnable接口的方式。
首先,定义一个实现了Runnable接口的类MyThread,重写run()方法,在该方法中编写线程的具体逻辑。
2. 启动多线程在主线程中,创建MyThread对象,并通过Thread类的构造函数将其作为参数传入。
然后,调用Thread类的start()方法启动线程。
3. 线程同步在多线程程序中,为了避免线程之间的数据竞争和冲突,需要进行线程同步。
Java提供了synchronized关键字和Lock接口来实现线程同步。
本实验使用synchronized关键字来保证线程的安全性。
4. 线程通信多线程之间的通信可以通过共享变量、wait()和notify()方法来实现。
本实验通过共享变量来实现线程通信,其中一个线程负责生产数据,另一个线程负责消费数据。
5. 线程池Java提供了Executor框架来管理线程池。
通过使用线程池,可以减少线程的创建和销毁开销,提高程序的性能。
本实验使用Executor框架来管理线程池,并设置合适的线程数量。
四、实验结果通过以上实验过程,成功实现了多线程程序,并观察到了以下结果:1. 多线程的执行顺序是不确定的,不同线程的执行顺序可能不同;2. 多线程程序可以提高程序的并发性和效率;3. 线程同步能够保证多线程程序的安全性;4. 线程通信可以实现多线程之间的数据交换和协作;5. 使用线程池可以提高程序的性能。
实验6:多线程实验 (1)

成绩:面向对象原理与Java实践课程实验报告实验6:多线程实验姓名林浩强班级网络14-2学号 14034460220实验地点软件实验室实验时间 2016.6.7指导教师姚明一、实验目的:●了解线程调度机制●理解线程同步机制●掌握线程设计方法二、实验要求:●掌握线程创建的方法●掌握线程的基本控制方法●掌握线程间的同步控制方法三、实验内容:1、随机生成1万个整数,利用线程技术计算两种不同排序算法对这些数排序的运行时间。
2、有一水塘,可实现注水和排水操作。
当水塘无水时不能对其再进行排水操作,当水塘水满时不能对其再进行注水操作。
创建水塘类Pond、注水线程Injection和排水线程Drain,假设注水线程可以在10分钟内将水塘注满水,排水线程可以在10分钟内将水塘的水全排出。
试实现水塘的注水和排水过程。
四、设计思路:首先,第一个实验的需求是随机生成10000个整数并且按两种算法排序,并利用线程的方式计算排序时间。
我用的排序算法是冒泡排序和选择排序法,在排序的前后分别用System 类的CurrentTimeMillis()方法获取当前时间的毫秒值,作差求出排序所用的时间。
最后在SortDemo类中启动线程即可。
、第二个实验的需求是实现注水和排水的操作,题目中指出“当水塘无水时不能对其再进行排水操作,当水塘水满时不能对其再进行注水操作”,所以我采用了线程的等待唤醒机制来实现。
首先在Pond类中声明一个标记变量flag,把注水和排水的操作封装成为功能并加了同步关键字synchronize,方法中运用了同步唤醒机制实现依次的一次一个输出。
然后在Injection类和Drain类中调用同步方法即可。
最后,在PondDemo中启动线程即可。
五、程序源代码:实验题目1:package java6_Test;import java.util.Random;public class Sort1 extends Thread {private Object obj = new Object();//重写run方法public void run() {//计时开始long l1 = System.currentTimeMillis();//用Object类对象设置同步锁synchronized (obj) {//随机生成10000个数并用相应长度数组来储存这些数int[] data = new int[10000];for (int x = 0; x < 10000; x++) {int b = r.nextInt();System.out.println(this.getName() + ":" + b);data[x] = b;}//调用自定义方法sort1sort1(data);//计时结束,计算所需的时间并输出long l2 = System.currentTimeMillis();System.out.println("共耗时"+(l2 - l1)+"毫秒");}}//冒泡排序法对数组中的数进行排序private synchronized void sort1(int[] data) {for (int x = 0; x < data.length - 1; x++) {for (int y = 0; y < data.length - 1 - x; y++) {if (data[y] > data[y + 1]) {int temp = data[y];data[y] = data[y + 1];data[y + 1] = temp;}}}System.out.println(this.getName()+"排序完成!");}}package java6_Test;import java.util.Random;public class Sort2 extends Thread {private Object obj = new Object();//重写run方法public void run() {//计时开始long l3 = System.currentTimeMillis();//用Object类对象设置同步锁synchronized (obj) {//随机生成10000个数并用相应长度数组来储存这些数int[] data = new int[10000];for (int x = 0; x < 10000; x++) {int b = r.nextInt();System.out.println(this.getName() + ":" + b);data[x] = b;}//调用自定义方法sort2sort2(data);//计时结束,计算所需的时间并输出long l4 = System.currentTimeMillis();System.out.println("共耗时" + (l4 - l3) + "毫秒");}}//选择排序法对数组中的数进行排序private synchronized void sort2(int[] data) {for (int x = 0; x < data.length - 1; x++) {for (int y = x + 1; y < data.length; y++) {if (data[y] < data[x]) {int temp = data[x];data[x] = data[y];data[y] = temp;}}}System.out.println(this.getName()+"排序完成!");}}package java6_Test;public class SortDemo {public static void main(String[] args) {//创建线程类的对象Sort1 s1 = new Sort1();Sort2 s2 = new Sort2();//启用线程s1、s2s1.start();s2.start();}}package java6_Test2;public class Pond {private boolean flag;//默认是没有数据,如果是true,说明有数据public synchronized void injection() {//如果没数据,就等待if (this.flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//注水过程System.out.println("注水十分钟");//修改标记并唤醒this.flag = true;this.notify();}public synchronized void drain() {//如果有数据,就等待if (!this.flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//排水过程System.out.println("排水十分钟");//修改标记并唤醒this.flag = false;this.notify();}}package java6_Test2;public class Injection implements Runnable { private Pond p;public Injection(Pond p) {this.p = p;}@Overridepublic void run() {while (true) {p.injection();}}}package java6_Test2;public class Drain implements Runnable {private Pond p;public Drain(Pond p) {super();this.p = p;}@Overridepublic void run() {while (true) {p.drain();}}}package java6_Test2;public class PondDemo {public static void main(String[] args) {//创建Pond资源类对象Pond p = new Pond();//创建注水类和排水类的对象Injection i = new Injection(p);Drain d = new Drain(p);//将注水类和排水类的对象作为参数调用线程类的对象Thread t1 = new Thread(i);Thread t2 = new Thread(d);//启动线程t1.start();t2.start();}}六、实验过程中遇到的问题及解决手段:在做实验任务一的时候,一开始没有设置同步锁对象,可能会出现问题,在线程执行过程中可能会被另外的线程执行了,这样的线程不是很安全。
实验6 多线程

实验6 多线程一、实验名称和性质二、实验目的1.理解线程概念;了解线程的状态和生命周期;2. 学习继承Thread类来创建线程;3. 理解线程互斥与同步的含义;掌握Synchrnized同步方法。
三、实验内容1.设计一个包含多线程运行的程序,在主程序中依次创建3个线程,然后按顺序启动这3个线程,每个线程在执行时都是先睡眠(sleep)一会儿,醒来之后再继续执行(验证性实验)。
2.用程序模拟铁路火车票售票系统,实现通过3个售票窗口同时发售某次列车的100张车票。
程序中会有3个线程同时对同一个车票对象进行操作,每个线程的操作都按相同的步骤进行,即将当前车票数加1,然后将当前车票数与剩余车票数显示出来。
由于车票数是临界资源,一次只能有一个线程完成读写操作,因此必须处理好线程之间的互斥关系(设计性实验)。
四、实验的软硬件环境要求硬件环境要求:PC计算机;内存512MB以上使用的软件名称、版本号以及模块:操作系统:Windows 2000或Windows XP软件:JDK7.0;Ecliplse五、知识准备前期要求掌握的知识:了解Java程序的运行流程。
实验相关理论或原理:多线程是指一个程序中可以包含两个或两个以上同时并发运行的程序单元,每个程序单元称之为一个线程。
Java为多线程编程提供了语言级的支持,因此可以编写高效率的程序。
一个线程从它被创建到运行结束的过程,称为线程的生命周期。
在Java中使用多线程有如下两种方式:一是继承Thread线程类,第二是实现Runnable接口。
在Thread类中有两个主要的方法,一个是run()方法,另一个是start()方法,在Thread类的派生类中要覆盖这个run()方法,将多线程代码放入其中。
Start()方法的作用是启动一个线程,它会自动地去调用run()方法以执行该线程。
为了使多个线程互斥地使用临界资源,可以在临界资源上使用synchrnized修饰符。
六、验证性实验1.实验要求编译、运行ThreeThreads.java程序,运行结果如图7.1所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成绩:面向对象原理与Java实践课程实验报告实验6:多线程实验姓名林浩强班级网络14-2学号 14034460220实验地点软件实验室实验时间 2016.6.7指导教师姚明一、实验目的:●了解线程调度机制●理解线程同步机制●掌握线程设计方法二、实验要求:●掌握线程创建的方法●掌握线程的基本控制方法●掌握线程间的同步控制方法三、实验内容:1、随机生成1万个整数,利用线程技术计算两种不同排序算法对这些数排序的运行时间。
2、有一水塘,可实现注水和排水操作。
当水塘无水时不能对其再进行排水操作,当水塘水满时不能对其再进行注水操作。
创建水塘类Pond、注水线程Injection和排水线程Drain,假设注水线程可以在10分钟内将水塘注满水,排水线程可以在10分钟内将水塘的水全排出。
试实现水塘的注水和排水过程。
四、设计思路:首先,第一个实验的需求是随机生成10000个整数并且按两种算法排序,并利用线程的方式计算排序时间。
我用的排序算法是冒泡排序和选择排序法,在排序的前后分别用System 类的CurrentTimeMillis()方法获取当前时间的毫秒值,作差求出排序所用的时间。
最后在SortDemo类中启动线程即可。
、第二个实验的需求是实现注水和排水的操作,题目中指出“当水塘无水时不能对其再进行排水操作,当水塘水满时不能对其再进行注水操作”,所以我采用了线程的等待唤醒机制来实现。
首先在Pond类中声明一个标记变量flag,把注水和排水的操作封装成为功能并加了同步关键字synchronize,方法中运用了同步唤醒机制实现依次的一次一个输出。
然后在Injection类和Drain类中调用同步方法即可。
最后,在PondDemo中启动线程即可。
五、程序源代码:实验题目1:package java6_Test;import java.util.Random;public class Sort1 extends Thread {private Object obj = new Object();//重写run方法public void run() {//计时开始long l1 = System.currentTimeMillis();//用Object类对象设置同步锁synchronized (obj) {//随机生成10000个数并用相应长度数组来储存这些数int[] data = new int[10000];for (int x = 0; x < 10000; x++) {int b = r.nextInt();System.out.println(this.getName() + ":" + b);data[x] = b;}//调用自定义方法sort1sort1(data);//计时结束,计算所需的时间并输出long l2 = System.currentTimeMillis();System.out.println("共耗时"+(l2 - l1)+"毫秒");}}//冒泡排序法对数组中的数进行排序private synchronized void sort1(int[] data) {for (int x = 0; x < data.length - 1; x++) {for (int y = 0; y < data.length - 1 - x; y++) {if (data[y] > data[y + 1]) {int temp = data[y];data[y] = data[y + 1];data[y + 1] = temp;}}}System.out.println(this.getName()+"排序完成!");}}package java6_Test;import java.util.Random;public class Sort2 extends Thread {private Object obj = new Object();//重写run方法public void run() {//计时开始long l3 = System.currentTimeMillis();//用Object类对象设置同步锁synchronized (obj) {//随机生成10000个数并用相应长度数组来储存这些数int[] data = new int[10000];for (int x = 0; x < 10000; x++) {int b = r.nextInt();System.out.println(this.getName() + ":" + b);data[x] = b;}//调用自定义方法sort2sort2(data);//计时结束,计算所需的时间并输出long l4 = System.currentTimeMillis();System.out.println("共耗时" + (l4 - l3) + "毫秒");}}//选择排序法对数组中的数进行排序private synchronized void sort2(int[] data) {for (int x = 0; x < data.length - 1; x++) {for (int y = x + 1; y < data.length; y++) {if (data[y] < data[x]) {int temp = data[x];data[x] = data[y];data[y] = temp;}}}System.out.println(this.getName()+"排序完成!");}}package java6_Test;public class SortDemo {public static void main(String[] args) {//创建线程类的对象Sort1 s1 = new Sort1();Sort2 s2 = new Sort2();//启用线程s1、s2s1.start();s2.start();}}package java6_Test2;public class Pond {private boolean flag;//默认是没有数据,如果是true,说明有数据public synchronized void injection() {//如果没数据,就等待if (this.flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//注水过程System.out.println("注水十分钟");//修改标记并唤醒this.flag = true;this.notify();}public synchronized void drain() {//如果有数据,就等待if (!this.flag) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//排水过程System.out.println("排水十分钟");//修改标记并唤醒this.flag = false;this.notify();}}package java6_Test2;public class Injection implements Runnable { private Pond p;public Injection(Pond p) {this.p = p;}@Overridepublic void run() {while (true) {p.injection();}}}package java6_Test2;public class Drain implements Runnable {private Pond p;public Drain(Pond p) {super();this.p = p;}@Overridepublic void run() {while (true) {p.drain();}}}package java6_Test2;public class PondDemo {public static void main(String[] args) {//创建Pond资源类对象Pond p = new Pond();//创建注水类和排水类的对象Injection i = new Injection(p);Drain d = new Drain(p);//将注水类和排水类的对象作为参数调用线程类的对象Thread t1 = new Thread(i);Thread t2 = new Thread(d);//启动线程t1.start();t2.start();}}六、实验过程中遇到的问题及解决手段:在做实验任务一的时候,一开始没有设置同步锁对象,可能会出现问题,在线程执行过程中可能会被另外的线程执行了,这样的线程不是很安全。
在加了同步锁之后,便不会发生这样的问题,线程会等着另外一个线程执行完再抢CPU的执行权,这样会安全点。
在做实验任务二时,我一开始采用实验任务一的做法,在运行时发现,出现了注水程序连续运行了很多次,而排水程序也是出现连续运行的情况,并没有我们要求的依次一注水一排水这样的流程执行。
经过在贴吧里面提问,我找到了原因,原因很简单,在线程执行过程中,CPU的一点点时间片的执行权,就足够你执行很多次了。
所以,通过查阅资料,我了解到了Java提供的一种等待唤醒机制可以完美解决这个问题。
同时我也改进了程序,一开始我把同步锁放在Injection类和Drain类中,作为同步代码块包裹程序,后来我发现也可以把操作封装成同步方法,而在Injection和Drain类中只要调用方法即可。
七、本次实验的体会(结论):多线程编程又称并发编程,在完成实验的过程中,我初步理解了多线程的工作原理,也学会了使用多线程来完成一些操作,相信这对我以后的java基础知识的加深有很大的帮助。
另外,我也了解到了java提供的线程同步方式:synchronized 关键字和Object类的wait、notify和notifyAll方法。
虽然这些可能只是皮毛,但是我相信在以后的学习中我会学习到更多的东西并把他们运用到实际工作中。