2008081042实验四 多线程

合集下载

windows的多线程同步实验报告

windows的多线程同步实验报告

一、实验目的在掌握基于消息的windows程序结构和多线程程序设计方法的基础上,设计一个多线程同步的程序。

使学生能够从程序设计的角度了解多线程程序设计的方法和在windows系统下多线程同步互斥的机制。

二、实验内容1.理解Windows程序设计的基本思想,理解基于消息的程序设计方法,能够设计出简单的基于事件的windows程序,完成基本控件的使用2.结合操作系统中信号量与互斥体的概念,在MFC中找到对应的相关类3.设计一个多线程同步的程序,多线程概述进程和线程都是操作系统的概念。

进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。

线程是进程内部的一个执行单元。

系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或WinMain函数,将程序的启动点提供给Windows系统。

主执行线程终止了,进程也就随之终止。

每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。

用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。

一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。

多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。

要说明的一点是,目前大多数的计算机都是单处理器(CPU)的,为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。

由此可见,如果两个非常活跃的线程为了抢夺对CPU的控制权,在线程切换时会消耗很多的CPU资源,反而会降低系统的性能。

这一点在多线程编程时应该注意。

Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。

实验四 多线程编程

实验四 多线程编程
实验四 多线程编程
实验目的
1. 掌握C#线程创建及启动方法; 2. 掌握合理共享线程资源的方法; 3. 掌握C#多线程程序的开发技巧。
第一部分 上机训练
1、多线程基本使用方法及其参数传递编程。 1)不需要传递参数,也不需要返回参数
ThreadStart是一个委托,该委托的定义为void ThreadStart(),没有参数与返回值。
大家带来很多不便。
2)通过设置处理
设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;在
你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库
中的控件的话,系统就不会再抛出你上面所说的这个错误了。
3)通过委托处理(建议使用)
//按钮事件 private void button1_Click(object sender, EventArgs e) {
Thread thread = new Thread(Flush); thread.IsBackground = true;//设置成后台线程 thread.Start(); } //线程执行的方法 private void Flush() { //定义委托 Action action = Байду номын сангаасelegate() {
IAsyncResult.IsCompleted属性表示委托异步执行是否完成。
委托的WaitOne方法等待异步方法执行完成。
3、多线程访问GUI界面的处理
1)多线程在GUI编程时出现的问题
在GUI编程时,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话

操作系统实验--多线程同步

操作系统实验--多线程同步

一、实验目的和内容1、实验目的在掌握基于消息的windows程序结构和多线程程序设计方法的基础上,设计一个多线程同步的程序。

使学生能够从程序设计的角度了解多线程程序设计的方法和在windows系统下多线程同步互斥的机制。

2、实验内容理解Windows程序设计的基本思想,理解基于消息的程序设计方法,能够设计出简单的基于事件的windows程序,完成基本控件的使用结合操作系统中信号量与互斥体的概念,在MFC中找到对应的相关类。

设计一个多线程同步的程序。

二、实验方案1、定义相关的信息,创建生产者和消费者线程。

设定生产和消费的规则,初步设定没生产两个产品就将其中一个取出消费。

2、设定一个循环队列,作为缓冲区,设计生产者消费者算法。

3、使用互斥的思路,当缓冲区满时迫使生产者等待,当缓冲区空时迫使消费者等待。

4、源代码#include <windows.h>#include <iostream>using namespace std;unsigned short ProductID = 0,ConsumeID = 0,in = 0,out = 0;const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列bool g_continue = true; //控制程序结束HANDLE g_hMutex; //用于线程间的互斥HANDLE g_hFullSemaphore;HANDLE g_hEmptySemaphore;DWORD WINAPI Producer(LPVOID); //生产者线程DWORD WINAPI Consumer(LPVOID); //消费者线程const unsigned short PRODUCERS_COUNT = 2; //生产者的个数const unsigned short CONSUMERS_COUNT = 1; //消费者的个数const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreads[PRODUCERS_COUNT]; //各线程的handleDWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符void Produce(){ cout << "正在生产第 " << ++ProductID << " 号产品 "; cout << "生产成功" << endl;}void Append(){ cout<< "存放新产品 ";g_buffer[in] = ProductID;in = (in+1)%SIZE_OF_BUFFER;cout<< "成功" << endl;cout<<"缓冲区情况"<<endl;for (int i=0;i<SIZE_OF_BUFFER;++i){cout << i <<": " << g_buffer[i];if (i==in) cout << " <-- 生产";if (i==out) cout << " <-- 消费";cout << endl;} cout<<endl;}void Take(){ cout<< "取出一个产品 ";ConsumeID = g_buffer[out];out = (out+1)%SIZE_OF_BUFFER;cout<< "成功" << endl;for (int i=0;i<SIZE_OF_BUFFER;++i){cout << i <<": " << g_buffer[i];if (i==in) cout << " <-- 生产";if (i==out) cout << " <-- 消费";cout << endl;}cout<<endl;}void Consume(){ cout<< "消费第 " << ConsumeID << " 号产品";cout<< "成功" << endl;}DWORD WINAPI Producer(LPVOID lpPara){ while(g_continue){WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE);Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);} return 0;}DWORD WINAPI Consumer(LPVOID lpPara){ while(g_continue){WaitForSingleObject(g_hEmptySemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Take();Consume();Sleep(2000);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL); }return 0;}int main(){ //创建各个互斥信号g_hMutex = CreateMutex(NULL,FALSE,NULL);g_hFullSemaphore= CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1, NULL);g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);//创建生产者线程for (int i=0;i<PRODUCERS_COUNT;++i){hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);if (hThreads[i]==NULL) return -1; }//创建消费者线程for(i=0;i<CONSUMERS_COUNT;++i){ hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0, Consumer,NULL,0,&consumerID[i]);if (hThreads[i]==NULL){ return -1; }while(g_continue){ if(getchar()){ g_continue = false; }//按回车后终止程序运行}return 0;}}三、实验数据、结果分析运行结果四、总结。

多线程程序实验报告(3篇)

多线程程序实验报告(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. 使用线程通信机制实现线程间的协作。

操作系统实验4-线程

操作系统实验4-线程

操作系统实验4-线程实验四线程⼀、基本信息⼆、实验内容在Windows和Linux操作系统上,分别利⽤Windows API和pthreads API,实现矩阵乘法。

三、实验⽬的通过实验,理解线程的概念,掌握在不同操作系统上创建和管理线程的⽅法,初步掌握多线程编程技术,并能使⽤不同操作系统提供的调试⼯具调试多线程程序。

四、设计思路和流程图(1)创建三个全局变量数组矩阵和⼀个结构体(2)创建线程组(3)在每个线程中计算A矩阵第M⾏与B矩阵第N列的乘积和,并将其赋值给C矩阵第M⾏第N列(4)主线程等待所有⼦线程完成操作(5)⼦线程结束线程(6)主线程将C矩阵的值打印出来五、主要数据结构及其说明1.Win32程序:#include#include#include#define M 3#define N 3#define K 2#define S M*N //线程数int A[M][K] = {{1,4},{2,5},{3,6}};int B[K][N] = {{8,7,6},{5,4,3}};int C[M][N];struct v{int i;//rowint j;//colomn};DWORD WINAPI Summation(LPVOID param){struct v* data = (struct v*)param; //强制转换数据类型int m;int sum = 0;for(m=0; m{sum += (A[data->i][m] * B[m][data->j]);}C[data->i][data->j] = sum;//将乘积和赋值给C矩阵return 0;}int main(){DWORD ThreadId;HANDLE ThreadHandles[S];//线程数组int i,j,m,n;for(i=0; ifor(j=0; jstruct v* data = (struct v*) malloc(sizeof(struct v));data->i = i;data->j = j;ThreadHandles[N * i + j] = CreateThread(//创建新线程NULL,0,Summation,data,0,&ThreadId);}//等待所有⼦线程结束操作WaitForMultipleObjects(S,ThreadHandles,TRUE,INFINITE); //关闭所有⼦线程for(i=0; iCloseHandle(ThreadHandles[i]);//打印C矩阵for(m=0; mfor(n=0; nprintf("%Id", C[m][n]);printf(" ");}printf("\n");}system("pause");return 0;}2.Pthread程序:#include#include#include#define M 3#define N 3#define K 2int A[M][K] = {{1,4},{2,5},{3,6}};int B[K][N] = {{8,7,6},{5,4,3}};int C[M][N];struct v{int i;//rowint j;//colomn};void *runner(void * param){struct v* data = (struct v*)param;//强制转换数据类型int a;int sum = 0;for(a=0; a{sum += (A[data->i][a] * B[a][data->j]);}C[data->i][data->j] = sum;pthread_exit(0);//线程结束}void main(){int i,j,n,m;for(i=0; ifor(j=0; jstruct v* data = (struct v*) malloc(sizeof(struct v));data->i = i;data->j = j;pthread_t tid;pthread_attr_t attr;pthread_attr_init(&attr);//默认线程属性pthread_create(&tid,&attr,runner,data);//创建新的线程pthread_join(tid,NULL);//主线程等待⼦线程结束操作}//打印C矩阵for(m=0; mfor(n=0; nprintf("%d", C[m][n]);printf(" ");}printf("\n");}return;}六、程序运⾏时的初值和运⾏结果1.Win32运⾏结果:2.Pthread运⾏结果:七、实验体会此次实验中学习了Win32与Pthread系统调⽤的线程的创建与操作,并且进⼀步了解了主线程和⼦线程之间的关系。

对多线程的实验和简单总结

对多线程的实验和简单总结

对多线程的实验和简单总结
1. 多线程就是多个异步/并⾏程序同时执⾏没有先后顺序 1. extends Thread , new 之后使⽤
2. implements Runnable 后 new Thread(r1)使⽤。

2. 线程池:有最⼩执⾏线程数,和执⾏最⼤值即若为3和10 ,⼀般任务不多时候线程数为3,如果任务多了即可达到10,若任务超了线程数最⼤值时
任务会塞到queue ⾥(queue有最⼤cache,若达到了最⼤cache,将对剩下任务不进⾏处理),等上⼀个线程空闲时cache⾥的线程继续被处理。

3. wait 和 notify ,就按上⼀个线程池,若达到了最⼤cache 进⾏wait(必须使⽤synchronized和锁,不然不⽣效) ,然后其他地⽅或者线程进⾏notifyALl(必须使⽤synchronized和同⼀个锁)。

4.synchronized 1.⼀个是在wait和notify 使⽤。

2.另⼀个是当多个线程调⽤某⼀个共同⽅法或者代码块时使⽤就是被多线程调⽤的地⽅使⽤。

锁可以⽤⼀个(new Object)。

synchronized代码块异步变成了同步。

必须上⼀个线程处理完即释放锁,才能到下⼀个线程。

实验4Java多线程编程

实验4Java多线程编程
实验4 Java多线程编程
⼀、实验⽬的
1、理解线程概念和定义。

2、掌握创建、管理和控制Java线程对象的⽅法,包括创建Java 线程对象、改变线程状态、设置线程优先级以控制线程调度等⽅法。

3、了解并执⾏的多线程间存在的各种不同关系,掌握实现线程互斥和线程同步的⽅法。

⼆、实验内容
(1)输⼊以下程序,观察输出结果。

(2)输⼊如下程序,观察输出结果。

三、按照要求编写程序
编写基于多线程的素数(是除了⾃⾝和1以外,没有其它素数因⼦的⾃然数)判定程序。

1、待判定的整数经过键盘录⼊后存放在.txt⽂件,
2、整数之间以空格分割
3、创建10个线程从⽂件中取出整数进⾏判定,
4、判定的结果存⼊到另⼀个列表中,⽤户可以通过键盘查询判定的结果。

四、实验结果
写实验报告。

内容包括:
1、习题的运⾏结果,源程序。

2、程序调试中出现的错误提⽰。

(英⽂、中⽂对照)
3、若有没通过的程序,分析原因。

Windows的多线程同步实验报告

一、实验目的在掌握基于消‎息的wind‎o ws程序结‎构和多线程程‎序设计方法的‎基础上,设计一个多线‎程同步的程序‎。

使学生能够从‎程序设计的角‎度了解多线程‎程序设计的方‎法和在win‎d ows系统‎下多线程同步‎互斥的机制。

二、实验内容1.理解Wind‎o ws程序设‎计的基本思想‎,理解基于消息‎的程序设计方‎法,能够设计出简‎单的基于事件‎的w indo‎w s程序,完成基本控件‎的使用2.结合操作系统‎中信号量与互‎斥体的概念,在MFC中找‎到对应的相关‎类3.设计一个多线‎程同步的程序‎,多线程概述进程和线程都‎是操作系统的‎概念。

进程是应用程‎序的执行实例‎,每个进程是由‎私有的虚拟地‎址空间、代码、数据和其它各‎种系统资源组‎成,进程在运行过‎程中创建的资‎源随着进程的‎终止而被销毁‎,所使用的系统‎资源在进程终‎止时被释放或‎关闭。

线程是进程内‎部的一个执行‎单元。

系统创建好进‎程后,实际上就启动‎执行了该进程‎的主执行线程‎,主执行线程以‎函数地址形式‎,比如说mai‎n或WinM‎a in函数,将程序的启动‎点提供给Wi‎n dows系‎统。

主执行线程终‎止了,进程也就随之‎终止。

每一个进程至‎少有一个主执‎行线程,它无需由用户‎去主动创建,是由系统自动‎创建的。

用户根据需要‎在应用程序中‎创建其它线程‎,多个线程并发‎地运行于同一‎个进程中。

一个进程中的‎所有线程都在‎该进程的虚拟‎地址空间中,共同使用这些‎虚拟地址空间‎、全局变量和系‎统资源,所以线程间的‎通讯非常方便‎,多线程技术的‎应用也较为广‎泛。

多线程可以实‎现并行处理,避免了某项任‎务长时间占用‎C P U时间。

要说明的一点‎是,目前大多数的‎计算机都是单‎处理器(CPU)的,为了运行所有‎这些线程,操作系统为每‎个独立线程安‎排一些CPU‎时间,操作系统以轮‎换方式向线程‎提供时间片,这就给人一种‎假象,好象这些线程‎都在同时运行‎。

实验4 多线程通讯实验报告

实验四多线程通讯实验报告【姓名】…【学号】…【实验题目】多线程通讯【实验目的】(1)加深对线程和多线程要领的理解;(2)掌握多线程程序设计的基本方法;(3)学习同一进程内线程间交换数据的方法。

【实验内容】设计一个单进程内多线程并发运行的程序,不同的线程完成下列不同的工作:(1)接收键盘输入线程负责接收用户的键盘输入,并以适当的方式将由键盘获得的数据交给其它线程处理。

(2)显示线程负责全部数据显示任务,包括键盘输入数据的显示和提示信息的显示。

(3)分发数据线程将键盘输入的数据分为3类,即字母、数字和其它,并分别将字母写入文件letter.txt 中,数字写入文件number.txt中,除字母和数字外其它数据丢弃。

【实验要求】1、程序能以适当的方式提示用户输入数据;2、提示用户有数据被丢弃;3、全部的显示任务必须由显示进程完成;4、整个程序能够连续处理多组输入数据,直到用户输入“quit”字符串,整个程序结束;5、进一步要求:比较线程间通信方式与进程间通信方式特点。

【实验方法】1、利用pthread_create()函数创建2个子线程,用一个父线程和两个子线程完成上面的三个实验任务,用子线程1负责键盘输入任务,子线程2实现数据分发任务,父线程实现全部的显示任务。

2、使用条件变量实现线程之间的同步。

条件变量允许线程挂起,知道共享数据上的某种条件满足。

在本程序中使用的条件变量上的基本操作有:触发条件;等待条件,挂起线程直到其他线程触发。

3、利用线程的互斥量的加锁与解锁,并和条件变量一起使用实现多线程之间的互斥。

4、利用while()循环、条件变量(实现同步)和互斥变量(实现互斥)实现连续多组数据输入。

【程序结构】·数据结构:字符数组等;·程序结构:顺序结构、if-else分支结构、for循环和while循环结构;·主要算法:无特别算法【实验结果】1、有代表性的执行结果:[stud13@localhost stud13]$ cc –lpthread itc.c[stud13@localhost stud13]$ ./a.outPlease input a line:∟operatingsystem01234-=,.Your message is:operatingsystem01234-=,.The characters deserted are:-=,.Please input a line:∟xushengju6651001!@#$%^&*()Your message is:xushengju6651001!@#$%^&*()The characters deserted are:!@#$%^&*()Please input a line:∟Hello123Your message is:Hello123Please input a line:∟quit[stud13@localhost stud13]$ cat letter.txtoperatingsystemxushengjuHello[stud13@localhost stud13]$ cat number.txt 012346651001123[stud13@localhost stud13]$2、结果分析及解释:先创建子线程1,输出提示信息“Please input a line:”,之后循环等待子线程3的信息,当子线程3等待到子线程2的输入数据后进行分发,再唤醒子线程1,显示输出从终端获得的数据,并显示丢弃的字符。

多进线程实验报告

一、实验目的1. 理解多线程的概念及其在程序设计中的应用。

2. 掌握Java语言中多线程的创建、同步、通信等基本技术。

3. 熟悉线程池的使用,提高程序执行效率。

4. 分析多线程程序中的线程安全问题,并采取相应的措施解决。

二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:Eclipse IDE4. 硬件环境:Intel Core i5处理器,4GB内存三、实验内容1. 创建多线程程序,实现两个线程同时执行。

2. 实现线程同步,防止数据竞态。

3. 使用线程池提高程序执行效率。

4. 分析多线程程序中的线程安全问题,并提出解决方案。

四、实验步骤1. 创建多线程程序在Java中,可以使用Thread类或Runnable接口创建线程。

以下是一个使用Runnable接口创建多线程的示例代码:```javapublic class MyThread implements Runnable {public void run() {System.out.println("线程 " + Thread.currentThread().getName() + " 正在执行");}}public class Main {public static void main(String[] args) {MyThread myThread1 = new MyThread();MyThread myThread2 = new MyThread();Thread thread1 = new Thread(myThread1);Thread thread2 = new Thread(myThread2);thread1.start();thread2.start();}}```2. 实现线程同步在多线程程序中,当多个线程访问共享资源时,可能会出现数据竞态问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

广州中医药大学信息技术学院实验报告课程名称:Java程序设计专业班级:计算机科学与技术2008级学生学号:2008081042学生姓名:王湛泽实验名称:JA V A程序设计实验成绩:课程类别:必修□限选 公选□其它□实验四多线程[实验目的]1.练习线程的使用以深入理解线程状态与生命周期。

2.了解线程调度机制、理解线程同步机制。

[实验内容]1.编写一个多线程的Java应用程序,经历线程不同的状态与生命周期。

2.编写一个多线程的Java应用程序,在程序中进行线程同步的处理。

[实验步骤与要求]第1题线程的状态编写一个Java应用程序,在主线程中再创建2个线程,要求线程经历4种状态:新建、运行、中断和死亡第2题排队买票编写一个Java应用程序,模拟5个人排队买票。

售票员只有1张五元的钱,电影票五元一张。

假设5个人的名字及排队顺序:赵、钱、孙、李、周。

“赵”拿一张二十元的人民币买2张票,“钱”拿1张二十元的人民币1张票,“孙”拿1张十元的人民币买1张票,“李”拿1张十元的人民币买2张票,“周”拿1张五元的人民币买1张票,要求售票员按如下规则找赎:二十元买2张票,找零:找1张十元;不许找2张五元二十元买1张票,找零:找1张十元,1张五元;不许找3张五元十元买1张票,找零:找1张五元[作业提交]第一题:将代码贴在下面:public class Example8_8{public static void main(String args[]){ClassRoom room=new ClassRoom();room.zhangHua.start();room.teacher.start();}}class ClassRoom implements Runnable{Thread zhangHua,teacher;ClassRoom(){teacher=new Thread(this);zhangHua=new Thread(this);zhangHua.setName("张华");teacher.setName("刘老师");}public void run(){Thread thread=Thread.currentThread();if(thread==zhangHua){try{ System.out.println(thread.getName()+"休息10秒后再说问候"); Thread.sleep(10000);}catch(InterruptedException e){System.out.println(thread.getName()+"被吵醒了");}System.out.println(thread.getName()+"说:早上好!");}else if(thread==teacher){for(int i=1;i<=2;i++){System.out.println(thread.getName()+"说:\t上课!");try{ Thread.sleep(500);}catch(InterruptedException e) {}}zhangHua.interrupt(); //吵醒zhangXiao }}}将结果运行截屏贴在下面:第二题:代码:public class Example8_10{public static void main(String args[]){String s1="张",s2="钱",s3="孙",s4="李",s5="周";Cinema canema=new Cinema(s1,s2,s3,s4,s5);Thread zhang,qian,sun,li,zhou;zhang=new Thread(canema);qian=new Thread(canema);sun=new Thread(canema);li=new Thread(canema);zhou=new Thread(canema);zhang.setName(s1);qian.setName(s2);sun.setName(s3);li.setName(s4);zhou.setName(s5);zhang.start();qian.start();sun.start();li.start();zhou.start();}}class Cinema implements Runnable{ //实现Runnable接口的类(电影院)TicketSeller seller; //电影院的售票员String name1,name2,name3,name4,name5; //买票人的名字(线程的名字) Cinema(String s1,String s2,String s3,String s4,String s5){seller=new TicketSeller();name1=s1;name2=s2;name3=s3;name4=s4;name5=s5;}public void run(){if(Thread.currentThread().getName().equals(name1)){seller.sellTicket(20);}else if(Thread.currentThread().getName().equals(name2)){seller.sellTicket(20);}else if(Thread.currentThread().getName().equals(name3)){seller.sellTicket(10);}else if(Thread.currentThread().getName().equals(name4)){seller.sellTicket(10);}else if(Thread.currentThread().getName().equals(name5)){seller.sellTicket(5);}}}class TicketSeller{ //负责卖票的类int fiveNumber=1,tenNumber=0,twentyNumber=0;public synchronized void sellTicket(int receiveMoney){String s=Thread.currentThread().getName();if(receiveMoney==5){fiveNumber=fiveNumber+1;System.out.println(s+"给售票员5元钱,售票员卖给"+s+"一张票,不必找赎");}else if(receiveMoney==10&&s=="李"){tenNumber=tenNumber+1;System.out.println(s+"给售票员10元钱,售票员卖给"+s+"两张票,不必找赎");}else if(receiveMoney==10&&s=="孙") {while (fiveNumber<1){try{ System.out.println(s+"给售票员10元钱");System.out.println("售票员请"+s+"靠边等一会");wait(); //如果线程占有CPU期间执行了wait(),就进入中断状态 System.out.println(s+"结束等待,继续买票");}catch(InterruptedException e){}}fiveNumber=fiveNumber-1;tenNumber=tenNumber+1;System.out.println(s+"给售票员10元钱,售票员卖给"+s+"一张票,找赎5元");}else if(receiveMoney==20&&s=="钱"){while(fiveNumber<1||tenNumber<1){try{ System.out.println(s+"给售票员20元钱");System.out.println("售票员请"+s+"靠边等一会");wait(); //如果线程占有CPU期间执行了wait(),就进入中断状态 System.out.println(s+"结束等待,继续买票");}catch(InterruptedException e){}}fiveNumber=fiveNumber-1;tenNumber=tenNumber-1;twentyNumber=twentyNumber+1;System.out.println(s+"给售票员20元钱,售票员卖给"+s+"一张票,找赎15元");}else if(receiveMoney==20&&s=="赵"){while(tenNumber<1){try{ System.out.println(s+"给售票员20元钱");System.out.println("售票员请"+s+"靠边等一会");wait(); //如果线程占有CPU期间执行了wait(),就进入中断状态 System.out.println(s+"结束等待,继续买票");}catch(InterruptedException e){}}tenNumber=tenNumber-1;twentyNumber=twentyNumber+1;System.out.println(s+"给售票员20元钱,售票员卖给"+s+"两张票,找赎15元");}截屏:(作业提交说明:实验完成后,将此文档和相关的程序源程序代码一并压缩后提交上来,文件名为自己的学号+实验四,如2008000001+实验四.RAR)。

相关文档
最新文档