第07章多线程信息学院级

上传人:仙*** 文档编号:54966342 上传时间:2022-02-16 格式:PPT 页数:46 大小:1.51MB
返回 下载 相关 举报
第07章多线程信息学院级_第1页
第1页 / 共46页
第07章多线程信息学院级_第2页
第2页 / 共46页
第07章多线程信息学院级_第3页
第3页 / 共46页
点击查看更多>>
资源描述
第第7章章 多线程多线程 7.1 操作系统中的进程与线程操作系统中的进程与线程 7.2 Java的线程对象的线程对象 7.3 线程的同步机制线程的同步机制1多线程程序示例(点名程序)多线程程序示例(点名程序)设计思路:设计思路:按照第按照第6章的知识完成章的知识完成UI设计;设计;完成在完成在”开始点名开始点名”按钮的事件处理方法按钮的事件处理方法p通过通过jxl.jar包的方法打开包的方法打开studentName.xls文件文件p通过随机函数,从通过随机函数,从excels文件读取人名,显示在文件读取人名,显示在TextField组件上组件上2 演示结果是:从console看到输出了人名,可在TextField上没有实时更新,只在最后才显示出人的名字 原因是什么? 如何解决呢?Jxl.jar包使用包使用3http:/ jxl.jar是通过java操作excel表格的工具类库 读取文件public static void main(String args)tryWorkbook book=Workbook.getWorkbook(new File(“测试测试.xls”);Sheet sheet=book.getSheet(0);Cell cell1=sheet.getCell(0,0);String result=cell1.getContents();.7.1 操作系统中的进程与线程操作系统中的进程与线程进程进程线程线程并发程序设计并发程序设计41. 进程进程1)进程的定义和属性)进程的定义和属性进程(进程(process)是一个可并发执行的具有独立功能的程序)是一个可并发执行的具有独立功能的程序(program)关于某个数据集合的一次执行过程,也是操作系)关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位。统进行资源分配和保护的基本单位。 结构性结构性:进程包括程序块、数据块和进程控制块三部分进程包括程序块、数据块和进程控制块三部分动态性:进程只程序的一次执行过程,是动态的概念动态性:进程只程序的一次执行过程,是动态的概念独立性:进行是系统调度的独立单位、是资源分配和保护的基本独立性:进行是系统调度的独立单位、是资源分配和保护的基本单位单位并发性:进程可以并发执行,提高资源利用率和系统效率并发性:进程可以并发执行,提高资源利用率和系统效率交互性交互性 :多个进程可以共享变量,通过共享变量实现相互通信,:多个进程可以共享变量,通过共享变量实现相互通信,多个进程能够协作完成一个任务。多个进程能够协作完成一个任务。5进程的状态进程的状态2) 进程的状态进程的状态就绪(就绪(ready)态:具备运行条件,等待系统分配资)态:具备运行条件,等待系统分配资源以便运行源以便运行运行(运行(running)态:进程占用系统资源正在运行)态:进程占用系统资源正在运行阻塞(阻塞(blocked)态)态 :正在等待某个事件任务的完成:正在等待某个事件任务的完成进程在执行过程中的任一时刻,都处于某个状态,根进程在执行过程中的任一时刻,都处于某个状态,根据运行条件在多个状态之间转变。据运行条件在多个状态之间转变。一个进程在创建后处于就绪状态,获得处理器后处于一个进程在创建后处于就绪状态,获得处理器后处于运行状态,运行中因等待事件处于阻塞状态。运行状态,运行中因等待事件处于阻塞状态。62. 线程线程1) 引入线程机制的动机和思路引入线程机制的动机和思路 动机:单线程进程调度存在进程时空开销大、进程通信动机:单线程进程调度存在进程时空开销大、进程通信代价大、不适合并行计算等问题。代价大、不适合并行计算等问题。 思路:将进程的两项功能:思路:将进程的两项功能:“独立分配资源独立分配资源”和和“被调被调度分派执行度分派执行”分离,前一项仍由进程完成,后一项交给线分离,前一项仍由进程完成,后一项交给线程完成。程完成。优点:进程作为资源分配和保护的独立单元,不优点:进程作为资源分配和保护的独立单元,不需要频繁切换;线程作为系统调用和分派的基本单元,频需要频繁切换;线程作为系统调用和分派的基本单元,频繁切换和调度。繁切换和调度。72) 线程的定义和属性线程的定义和属性线程(线程(thread)是操作系统进程中能够独立执行的实)是操作系统进程中能够独立执行的实体(控制流),是处理器调度和分派的基本单位。体(控制流),是处理器调度和分派的基本单位。线程是进程的组成部分;线程是进程的组成部分;同一进程中的线程共享进程的内存资源和空间;同一进程中的线程共享进程的内存资源和空间;并发性并发性共享性共享性动态性动态性结构性结构性8 3) 线程的状态线程的状态 5) 线程调度:线程调度:任意时刻一个处理器上只能运行一个线程,其他线程排队等任意时刻一个处理器上只能运行一个线程,其他线程排队等待待调度原则是同一调度原则是同一优先级优先级采用先到先服务原则采用先到先服务原则 线程剥夺原则有两种:高优先级、时间片结束线程剥夺原则有两种:高优先级、时间片结束93. 并发程序设计并发程序设计1) 顺序程序设计的特点顺序程序设计的特点执行的顺序性。执行的顺序性。环境的封闭性。环境的封闭性。执行结果的确定性。执行结果的确定性。计算结果的可再现性。计算结果的可再现性。2) 并发程序设计的特点:并发程序设计的特点:并发性:不一定按顺序执行;并发性:不一定按顺序执行;结果不确定性:线程之间会相互影响,执行结果结果不确定性:线程之间会相互影响,执行结果不确定;不确定;制约性:多线程之间相互交互,需要有机制相互制约性:多线程之间相互交互,需要有机制相互制约,才能得到正确结果。制约,才能得到正确结果。并发程序设计优点:提高性能、减少开销等并发程序设计优点:提高性能、减少开销等107.2 Java的线程对象的线程对象7.2.1 Runnable接口与接口与Thread类类7.2.2 线程对象的优先级线程对象的优先级7.2.3 线程对象的生命周期线程对象的生命周期7.2.4 定时器与图形动画设计定时器与图形动画设计117.2.1 Runnable接口与接口与Thread类类Runnable接口接口public interface Runnable public abstract void run(); 一个线程对象必须实现run()方法,描述该线程的所有活动及操作。 已经实现的run()方法称为该对象的线程体12 Runnable接口约定线程执行的方法 Thread类提供创建、管理和控制线程对象的方法2. Thread线程类线程类public class Thread extends Object implements Runnable public Thread() /构造方法构造方法 public Thread(String name) /name指定线程名指定线程名 public Thread(Runnable target) /target指定线程的目标对象指定线程的目标对象 public Thread(Runnable target, String name) public void run() /描述线程操作的线程体描述线程操作的线程体 public final String getName() /返回线程名返回线程名 public final void setName(String name) /设置线程名设置线程名 public static int activeCount() /返回当前活动线程个数返回当前活动线程个数 public static Thread currentThread() /返回当前执行线程对象返回当前执行线程对象 public Sting toString() /返回线程的字符串信息返回线程的字符串信息 public void start() /启动已创建的线程对象启动已创建的线程对象 Java提供两种实现多线程程序设计方法:继承Thread类和实现Runnable接口; 两种方法的核心是实现run()方法线程体13【例【例7.1】 声明继承声明继承Thread类的奇数类的奇数/偶数序列线程偶数序列线程main是首先启动执行的线程是首先启动执行的线程两个线程交替运行两个线程交替运行多线程程序结果具有不确定性,尤其是运行时间较长(输出多线程程序结果具有不确定性,尤其是运行时间较长(输出序列长)序列长)14【例【例7.2】 声明实现声明实现Runnable接口的奇数接口的奇数/偶数序列线程。偶数序列线程。Runnable接口实现多线程:接口实现多线程: Thread 构造方法构造方法: public Thread(Runnable target);Thread的的run方法:方法:public void run() /描述线程操作的线程体描述线程操作的线程体 if (target != null) target.run(); /执行目标对象的执行目标对象的run()方法方法Thread t1 = new Thread(); /t1的的run()方法为空方法为空Thread thread_odd = new Thread(odd,奇数线程奇数线程); 153. 两种创建线程方式的比较(两种创建线程方式的比较(P189)两种方法创建线程两种方法创建线程(1) 继承线程继承线程Thread类类声明一个线程类继承声明一个线程类继承Thread类,实现类,实现run方法,说方法,说明线程对象所执行的操作。优点是具有明线程对象所执行的操作。优点是具有Thread类声类声明的方法,且具有线程体;缺点是不适用于多继承。明的方法,且具有线程体;缺点是不适用于多继承。(2) 实现实现Runnable接口接口实现实现Runnable接口说明线程体所执行操作,同时还接口说明线程体所执行操作,同时还需要声明需要声明Thread对象来实现线程创建、启动等操作。对象来实现线程创建、启动等操作。补充说明:补充说明:JDK5提供线程池功能提供线程池功能16线程池线程池1.在什么情况下使用线程池?(1)单个任务处理的时间比较短(2)将需处理的任务的数量大2.使用线程池的好处:(1)减少在创建和销毁线程上所花的时间以及系统资源的开销(2)如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”3.线程池的几个概念(1)线程池(Threadpool),池是一个容器,容器中有很多个执行器,每一个执行器是一个线程。(2)执行器(Executor),每个执行器是一个线程,每个执行器可以执行一个任务。(3)任务(Task),任务是每个线程具体要做的事,如资源下载,播放flash片段,打印一段文字到控制台等等,它本身不能执行,而需要将自身交给执行器。174. JDK自带线程池(1)newFixedThreadPool创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。(2)newCachedThreadPool创建一个可缓存的线程池。这种类型的线程池特点是:1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger.MAX_VALUE),这样可灵活的往线程池中添加线程。2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。(3)newSingleThreadExecutor创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行(我觉得这点是它的特色)。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。(4)newScheduleThreadPool创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。187.2.2 线程对象的优先级线程对象的优先级Thread类中声明了类中声明了3个表示优先级的公有静态常量:个表示优先级的公有静态常量:public static final int MIN_PRIORITY=1 /最低优先级最低优先级public static final int MAX_PRIORITY=10 /最高优先级最高优先级public static final int NORM_PRIORITY=5 /默认优先级默认优先级Thread类中与线程优先级有关的方法有以下类中与线程优先级有关的方法有以下2个:个:public final int getPriority() /获得线程优先级获得线程优先级public final void setPriority(int newPriority)/设置线程优先级设置线程优先级在在windows中,直接设置优先级效果不明显,中,直接设置优先级效果不明显,NumberThread.java中演示中演示197.2.3 线程对象的生命周期线程对象的生命周期Thread.State类声明的线程状态类声明的线程状态新建态、运行态、阻塞态和等待态、终止态新建态、运行态、阻塞态和等待态、终止态 线程的生命周期就是从新建到终止这个过程。202. Thread类中改变和判断线程状态的方法类中改变和判断线程状态的方法线程启动线程启动public void start() /启动线程对象启动线程对象public final boolean isAlive() /是否启动是否启动线程睡眠线程睡眠public static void sleep(long millis) throws InterruptedException线程中断线程中断public void interrupt() /设置中断标记设置中断标记public boolean isInterrupted() /判断是否中断判断是否中断public static boolean interrupted() /判断是否中断判断是否中断21【例【例7.3】 设计滚动字演示线程状态及改变方法。设计滚动字演示线程状态及改变方法。本例演示线程对象的生命周期从创建到终止的过程,期间本例演示线程对象的生命周期从创建到终止的过程,期间使用使用new、start()、sleep()、interrupt()等方法改变线程的等方法改变线程的状态。本例综合运用内部类、图形用户界面、线程等多方面技状态。本例综合运用内部类、图形用户界面、线程等多方面技术实现设计思想。术实现设计思想。 声明自定义面板类为私有内部类并实现多个接口对象嵌套声明自定义面板类为私有内部类并实现多个接口对象嵌套线程状态变化线程状态变化代码简要说明:WelcomeJFrame构造方法中,创建多个RollbyJPanel,每个对应一个滚动字小窗口和一个线程启动、中断以及sleep文本框都注册ActionListener在事件处理器中对线程进行start、interrupt操作227.2.4 定时器与图形动画设计定时器与图形动画设计public class Timer implements Serializable public Timer(int delay, ActionListener l) public void addActionListener(ActionListener l) /注注册定时事件监听器册定时事件监听器 public void setDelay(int delay) /设置延时的时间间隔设置延时的时间间隔 public void start() /启动定时器启动定时器 public void stop() /停止定时器停止定时器 public void restart() /重新启动定时器重新启动定时器【例【例7.4】 弹弹球,使用定时器实现图形动画。弹弹球,使用定时器实现图形动画。代码简要说明:BallsCanvas构造方法中,创建并启动了定时器,定时器时间处理方法中repaint;同时注册了FocusListenerBallsJFrame构造方法中,为Jspinner组件注册了ChangeListener23java.util.Timerpublic class Timer implements Serializable public Timer() /创建新定时器创建新定时器 public void schedule(TimerTask task, long delay) /安排在指定安排在指定延迟后执行指定的任务。延迟后执行指定的任务。 public void schedule(TimerTask task, long delay, long period) /安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。 public void cancel() /终止此计时器,丢弃所有当前已安排的任务。终止此计时器,丢弃所有当前已安排的任务。247.3 线程的同步机制线程的同步机制7.3.1 交互线程交互线程7.3.2 线程间的竞争关系与线程互斥线程间的竞争关系与线程互斥7.3.3 线程间的协作关系与线程同步线程间的协作关系与线程同步 如果并发执行的多个线程问需要共享资源或交换如果并发执行的多个线程问需要共享资源或交换数据,则称这一组线程为交互线程。数据,则称这一组线程为交互线程。 交互线程并发执行时相互之间会干扰或影响其他交互线程并发执行时相互之间会干扰或影响其他线程的执行结果,因此交互线程间需要有同步机线程的执行结果,因此交互线程间需要有同步机制。制。 25无关线程与交互线程无关线程与交互线程 无关线程:并发线程操作不同的变量集合。操作的结果不会相互影响。如前面的奇偶数打印的两个线程 交互线程:并发线程共享某些变量,一个线程执行过程中修改的变量值有可能影响到其他线程的执行结果。 交互线程的控制:由于交互线程之间有相互的制约关系,所以需要对其进行控制,否则结果就有可能不正确267.3.1 交互线程交互线程271. 线程交互线程交互交互线程间存在两种关系交互线程间存在两种关系:竞争关系和协作关系。竞争关系和协作关系。竞争关系的交互线程间需要采用线程互斥方式解决的交互线程间需要采用线程互斥方式解决共享资源冲突问题。共享资源冲突问题。协作关系的交互线程间需要采用线程同步方式解决的交互线程间需要采用线程同步方式解决线程问线程问 通信及因执行速度不同而引起的不同步问题。通信及因执行速度不同而引起的不同步问题。线程的同步机制线程的同步机制包括线程互斥和线程同步,线程互包括线程互斥和线程同步,线程互斥是线程同步的特殊情况斥是线程同步的特殊情况【例【例7.5】 银行账户的存银行账户的存/取款线程设计。取款线程设计。图图7.7 并发线程共享临界资源并发线程共享临界资源 2. 并发执行的交互线程间存在与时间有关的错误并发执行的交互线程间存在与时间有关的错误结果的原因分析:有3个线程同时操作wang帐号,由于线程调度的因素,在某个线程执行的过程中(还没有结束),会被中断执行,转而执行另外一个线程。287.3.2 线程间的竞争关系与线程互斥线程间的竞争关系与线程互斥线程间的竞争关系线程间的竞争关系两个线程共享同一资源,一个线程获得该资源,另一个线两个线程共享同一资源,一个线程获得该资源,另一个线程就必须等待。程就必须等待。极端的状态:被阻塞线程永远得不到访问权。出现两个问极端的状态:被阻塞线程永远得不到访问权。出现两个问题:死锁、饥饿。题:死锁、饥饿。 (a) 死锁,路口4个方向全是绿灯(b) 饥饿,路口4个方向全是红灯292. 线程互斥和临界区管理线程互斥和临界区管理操作系统对共享一个变量的若干线程进入各自操作系统对共享一个变量的若干线程进入各自临界区有以下临界区有以下3个调度原则:个调度原则:一次至多一个线程能够在它的临界区内。一次至多一个线程能够在它的临界区内。不能让一个线程无限地留在它的临界区内。不能让一个线程无限地留在它的临界区内。不能强迫一个线程无限地等待进入它的临界区。不能强迫一个线程无限地等待进入它的临界区。特别地,进入临界区的任一线程不能妨碍正等特别地,进入临界区的任一线程不能妨碍正等待进入的其他线程的进展。待进入的其他线程的进展。 临界资源临界资源:多线程共享变量代表的资源称为临界资源; 临界区临界区:并发线程中与共享变量有关的程序段称为临界区303. Java的线程互斥实现的线程互斥实现(1) 同步语句同步语句synchronized (对象对象) /对象即临界资源对象即临界资源 语句语句 /语句块为临界区语句块为临界区(2)同步方法)同步方法synchronized 方法声明方法声明 /同步方法体为临界区同步方法体为临界区基于操作系统对于线程进入临界区的3条原则,可以使用同步语句和同步方法来实现线程互斥。31【例【例7.6】 互斥的存互斥的存/取款线程设计。取款线程设计。图图7.9 带互斥锁的并发线程执行流程带互斥锁的并发线程执行流程 32线程体中互斥锁的用法线程体中互斥锁的用法public void run() synchronized(this.account) /声明临界区,锁定指定账户对象声明临界区,锁定指定账户对象 double howmatch = this.account.balance(); try Thread.sleep(1); /花费时间花费时间 catch(InterruptedException e) this.account.put(this.value); System.out.println(this.account.getName()+账户:现有账户:现有+howmatch+, 存入存入+this.value+, 余额余额+this.account.balance(); 保证了存钱或取钱操作过程中不会被其他线程中断 只有完成一次性完整存钱或取钱操作,才把资源释放给其他线程。33同步方法实现互斥同步方法实现互斥34public void run() doRun();public synchronized void doRun() double howmatch = this.account.balance();try Thread.sleep(1); / 花费时间花费时间 catch (InterruptedException e) this.account.put(this.value);System.out.println(this.account.getName() + 账户:账户:现有现有 + howmatch + , 存入存入+ this.value + , 余额余额 + this.account.balance();7.3.3 线程间的协作关系与线程同步线程间的协作关系与线程同步线程间的协作关系线程间的协作关系 多个线程共同完成一个任务而分工协作,但是每个线程多个线程共同完成一个任务而分工协作,但是每个线程都是独立的速度在执行,需要在某些特定的协调点上实都是独立的速度在执行,需要在某些特定的协调点上实现线程之间的同步。现线程之间的同步。【例【例7.7】 发送线程与接收线程。发送线程与接收线程。例子分析:例子分析:发送线程向发送线程向buffer里面存数据,接收线程从里面存数据,接收线程从buffer里面去数据里面去数据理想情况是:发送线程存一个,接收线程取一个理想情况是:发送线程存一个,接收线程取一个实际情况:由于两个线程是独立运行,步调不一定一致。实际情况:由于两个线程是独立运行,步调不一定一致。解决思路:发送线程存完数据后,通知接收线程来取;接收线解决思路:发送线程存完数据后,通知接收线程来取;接收线程取完数据后通知发送线程可以继续存数据。程取完数据后通知发送线程可以继续存数据。35线程间的协作关系:线程间的协作关系:当一个进程中多个线程分工协作完成同一任务时,当一个进程中多个线程分工协作完成同一任务时,它们之间彼此有联系,而且受其他线程执行结果的影它们之间彼此有联系,而且受其他线程执行结果的影响。这些线程之间有响。这些线程之间有直接制约关系直接制约关系。由于各个线程都是独立以不可预知的速度推进,需由于各个线程都是独立以不可预知的速度推进,需要协作的线程必须在某些要协作的线程必须在某些事先设置的协调点上协调事先设置的协调点上协调各各自的工作。自的工作。当某个线程到达协调点,而其他线程还未到达时,当某个线程到达协调点,而其他线程还未到达时,其需要其需要阻塞自己阻塞自己,直到其他合作线程发来协调信号后,直到其他合作线程发来协调信号后方被方被唤醒继续执行唤醒继续执行。36线程同步是解决线程协作关系的手段。线程同步是解决线程协作关系的手段。线程互斥(存取款的例子)是线程同步的特线程互斥(存取款的例子)是线程同步的特殊例子。即逐次使用互斥共享资源。殊例子。即逐次使用互斥共享资源。2. 线程同步线程同步373. 线程同步机制线程同步机制线程同步机制线程同步机制设置信号设置信号为共享变量(协调点变量)约定一个信号量为共享变量(协调点变量)约定一个信号量(Semaphore),信号量有多种状态。对信号量有,信号量有多种状态。对信号量有P(测(测试信号量)操作和试信号量)操作和V(改变信号量)操作;(改变信号量)操作;线程根据信号量状态而执行线程根据信号量状态而执行多线程根据多线程根据P操作获得信号状态,并根据信号量状态决定操作获得信号状态,并根据信号量状态决定哪个线程执行,执行后进行哪个线程执行,执行后进行V操作操作 如以如以Buffer的状态为信号量,的状态为信号量, 发送线程检测状态为空(发送线程检测状态为空(P操作)才发送数据,发送后将操作)才发送数据,发送后将状态只为满(状态只为满(V操作)操作) 接收线程检测状态为满(接收线程检测状态为满(P操作)才接收数据,接收后将操作)才接收数据,接收后将状态置空(状态置空(V操作)操作)384. 线程通信方法线程通信方法Java的线程通信方法的线程通信方法public final void wait() throws InterruptedException /等待等待阻塞本线程阻塞本线程public final native void notify(); /唤醒一个等待线程唤醒一个等待线程public final native void notifyAll(); /唤醒所有等待线程唤醒所有等待线程线程通信方法结合信号量的线程通信方法结合信号量的PV操作就可以实现线程操作就可以实现线程间的协作。间的协作。39【例【例7.8】 采用信号量和同步方法使发采用信号量和同步方法使发送线程与接收线程同步运行。送线程与接收线程同步运行。图图7.11 发送线程与接收线程同步执行流程发送线程与接收线程同步执行流程 否临界区,互斥执行,不能被打断缓冲区空?(信号量值)(a) put()方法在缓冲区中放置值唤醒其他等待线程设置缓冲区为不空状态等待是被唤醒发送线程缓冲区不空?(b) get()方法从缓冲区中取值唤醒其他等待线程设置缓冲区为空状态等待是否被唤醒接收线程调用调用唤醒唤醒40【例【例7.9】 发牌程序。发牌程序。图图7.12 1个发牌线程与个发牌线程与4个取牌线程个取牌线程 程序说明:程序说明:约定一个缓冲区存放一张牌,缓冲区状态设置为信号量约定一个缓冲区存放一张牌,缓冲区状态设置为信号量发牌线程,一次产生发牌线程,一次产生152中的一个数,每次发送一个数字到中的一个数,每次发送一个数字到缓冲区缓冲区4取牌线程编号为取牌线程编号为03,约定依次从缓冲区里取牌,约定依次从缓冲区里取牌发牌线程优先级高于取牌线程,任何一个取牌线程执行后切发牌线程优先级高于取牌线程,任何一个取牌线程执行后切换到发牌线程执行换到发牌线程执行41程序分析:程序分析:缓冲区状态设置为信号量缓冲区状态设置为信号量isEmpty,用来保证发牌线程和取牌,用来保证发牌线程和取牌线程之间的同步;线程之间的同步;为保证为保证4个发牌线程之间的同步,需要设置一个个发牌线程之间的同步,需要设置一个取牌次序信号取牌次序信号量量order,这个信号量有,这个信号量有4个状态,约定为个状态,约定为03,每个状态表示一,每个状态表示一个取牌线程能够执行。个取牌线程能够执行。线程的通信主要发生在发牌线程和取牌线程之间。理解信号线程的通信主要发生在发牌线程和取牌线程之间。理解信号量量PV操作以及线程间通过操作以及线程间通过wait和和notify方法进行通信。方法进行通信。42修改程序,实现随机发牌修改程序,实现随机发牌程序思路:程序思路:修改发牌线程,先把修改发牌线程,先把152的数字洗乱,存放到列表中;的数字洗乱,存放到列表中;发牌时,从列表中依次取出乱序后的数字。发牌时,从列表中依次取出乱序后的数字。43习习 题题444546
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!