编程红宝书(珍藏版) ava 完金自学手册 9.3线程的状态 ·在Java中线程的执行过程稍微有些复杂,但线程对象创建 后并不不是立即执行,需要做些准备工作才有执行的权利, 而一旦抢占到CPU周期,则线程可以运行,但CPU周期结束 则线程必须暂时停止,或线程执行过程中的某个条件无法 满足时也会暂时停止,只有等待条件满足时才会继续执行, 最后从runO方法返回后,线程退出。可以看出线程的执行 过程中涉及一些状态,线程就在这些状态之间迁移。 做一点说明,Java规范中只定义了线程的四种状态,即新 建状态、可运行状态、阻塞状态和死亡状态。为了更清晰 的说明线程的状态变化过程,我们认为划分为五个状态更 好理解,这里把可运行状态( Runnable)分解为就绪状态 和运行状态,可以更好的理解可运行状态的含义。 线程包括五个状态:新建状态、就绪状态、运行状态、阻 塞状态和死亡状态。下面分别详细介绍这五种状态 G想撼玩出
9.3 线程的状态 • 在Java中线程的执行过程稍微有些复杂,但线程对象创建 后并不不是立即执行,需要做些准备工作才有执行的权利, 而一旦抢占到CPU周期,则线程可以运行,但CPU周期结束 则线程必须暂时停止,或线程执行过程中的某个条件无法 满足时也会暂时停止,只有等待条件满足时才会继续执行, 最后从run()方法返回后,线程退出。可以看出线程的执行 过程中涉及一些状态,线程就在这些状态之间迁移。 • 做一点说明,Java规范中只定义了线程的四种状态,即新 建状态、可运行状态、阻塞状态和死亡状态。为了更清晰 的说明线程的状态变化过程,我们认为划分为五个状态更 好理解,这里把可运行状态(Runnable)分解为就绪状态 和运行状态,可以更好的理解可运行状态的含义。 • 线程包括五个状态:新建状态、就绪状态、运行状态、阻 塞状态和死亡状态。下面分别详细介绍这五种状态
编程红宝书(珍藏版) ava 完金自学手册 9.4线程的优先级 线程的有限级表示一个线程被CPU执行的机会多少。注意 这里用“机会多少”来表达而不是用“先后顺序”来表达。 在Java中虽然定义了设置线程优先级高低的方法,但是优 先级低并不意味着在不同优先级的线程中就不会被执行, 优先级低只说明该线程被执行的概率小,同理优先级高的 线程获得CPU的概率就大 通过 Tread类的 setPriority o方法设置线程的优先级,该 方法的参数为int型,其实Java提供了三个优先级别,都为 Thread类的常量,从高到低依次为 Thread.MAX- PRIORITY Thread. NORM PRIORITY、 Thread. MIN PRIORITY。这里再次 重申,优先级低并不意味着线程得不到执行,而是线程被 优先执行的概率小。这也说明设置线程的优先级不会造成 死锁的发生 Q想桃工业出隙社
9.4 线程的优先级 • 线程的有限级表示一个线程被CPU执行的机会多少。注意, 这里用“机会多少”来表达而不是用“先后顺序”来表达。 在Java中虽然定义了设置线程优先级高低的方法,但是优 先级低并不意味着在不同优先级的线程中就不会被执行, 优先级低只说明该线程被执行的概率小,同理优先级高的 线程获得CPU的概率就大。 • 通过Tread类的setPriority()方法设置线程的优先级,该 方法的参数为int型,其实Java提供了三个优先级别,都为 Thread类的常量,从高到低依次为Thread. MAX-PRIORITY、 Thread.NORM_PRIORITY、Thread.MIN_PRIORITY。这里再次 重申,优先级低并不意味着线程得不到执行,而是线程被 优先执行的概率小。这也说明设置线程的优先级不会造成 死锁的发生
编程红宝书(珍藏版) ava 完金自学手册 9.5线程的同步 在多线程中经常遇到的一个问题就是资源共享问 题,假设两个线程同时访问一个数据区,一个读 数据、一个写数据,在一个线程读数据前另一个 线程修改了数据,则读数据线程读到的不是原始 数据而是被修改过的数据,显然这样使不允许的。 而在多线程编程中经常会遇到访问共享资源的问 题,这些资源可以是数据、文件、一块内存区或 是外围设备的访问等。所以必须解决多线程编程 中如何实现资源的共享问题,在Java中称为线程 的同步问题,在多数的编程语言中解决共享资源 冲突的方法是采用顺序机制( Serialize),通过 为共享资源加锁的方法实现资源的顺序访问 Q想桃工业出隙社
9.5 线程的同步 • 在多线程中经常遇到的一个问题就是资源共享问 题,假设两个线程同时访问一个数据区,一个读 数据、一个写数据,在一个线程读数据前另一个 线程修改了数据,则读数据线程读到的不是原始 数据而是被修改过的数据,显然这样使不允许的。 而在多线程编程中经常会遇到访问共享资源的问 题,这些资源可以是数据、文件、一块内存区或 是外围设备的访问等。所以必须解决多线程编程 中如何实现资源的共享问题,在Java中称为线程 的同步问题,在多数的编程语言中解决共享资源 冲突的方法是采用顺序机制(Serialize),通过 为共享资源加锁的方法实现资源的顺序访问
编程红宝书(珍藏版) ava 完金自学手册 9.5.1Java程序的资源共享 通过下面的例子,说明如果没有实现线程同步的访问共享 资源会遇到的问题。我们设计一个线程类 FooOne,该类的 多线程代码无限循环的输出一个值,每次循环该值递增, 但递增到100时,停止循环线程退出,这由方法runQ中调 用方法 printval0实现。另一个线程类 FooTwo调用类 FooOne的对象,该类的run0方法调用类 FooOne对象的 printval0方法,也实现对变量的递增输出。我们希望是 两次调用各自完成变量的递增,相互之间不要有干扰,即 两次调用要求顺序执行。但事实上目前我们无法控制这种 顺序执行(随后会介绍 synchronized关键字解决这个问 题)。所以结果是两个线程交替执行,确实实现了并发, 或者更抽象的说两个线程同时访问了某个资源,造成数据 的不确定性。 Q想桃工业出隙社
9.5.1 Java程序的资源共享 • 通过下面的例子,说明如果没有实现线程同步的访问共享 资源会遇到的问题。我们设计一个线程类FooOne,该类的 多线程代码无限循环的输出一个值,每次循环该值递增, 但递增到100时,停止循环线程退出,这由方法run()中调 用方法printVal()实现。另一个线程类FooTwo调用类 FooOne的对象,该类的run()方法调用类FooOne对象的 printVal()方法,也实现对变量的递增输出。我们希望是 两次调用各自完成变量的递增,相互之间不要有干扰,即 两次调用要求顺序执行。但事实上目前我们无法控制这种 顺序执行(随后会介绍synchronized关键字解决这个问 题)。所以结果是两个线程交替执行,确实实现了并发, 或者更抽象的说两个线程同时访问了某个资源,造成数据 的不确定性