多线程学习-基础(三)线程的调度

一、线程调度
(1)调整线程的优先级
Java线程有优先级,优先级高的线程会获得较多的执行机会,但是只是抢占cpu使用权的机会增加了,并不意味着就一定先执行。
Java线程的优先级用整数来表示,取值范围为:1~10 ,Thread有以下3个静态常量:
static int MAX_PRIORITY
线程可以具有最高优先级 取值:10
static int MIN_PRIORITY
线程可以具有最低优先级,取值:1
static int NORM_PRIORITY
分配给线程的默认优先级,取值:5

Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。

特别说明:

  线程优先级的高低只是说明,高优先级的线程竞争到cpu执行权限的几率比较大,而低优先级的线程竞争到cpu执行权限的几率比较小。但并不是高优先级线程就一定先比低优先级的线程先执行。

每个线程都有默认的优先级,主程序(main)的默认优先级为:Thread.NORM_PRIORITY。
线程的优先级有继承关系,比如A线程中创建了B线程,那么B线程具有和A线程一样的优先级。
JVM提供了10个优先级供选择,但与常见的系统都不能能很好的映射,如果希望程序能很好地移植到各个操作系统中,应该仅仅使用Thread类中有的那三个静态常量作为优先级,这样能保证同样的优先级采用了同样的调度。

(2)线程休眠:Thread.sleep(long millis)方法,使得线程转到阻塞状态(不会释放所持持有的对象锁)。millis参数设置睡眠的时间,当睡眠结束后转为就绪(Runnable)状态。sleep()平台移植性好。
(3)线程等待:Object类中的wait()方法,导致当前线程等待,直到其他线程调用此对象的notify()或者notifyAll()唤醒方法。这2个唤醒方法也是Object类中的方法,行为等价于调用wait(0)一样。
(4)线程让步:Thread.yield()方法,暂停当前正在执行的线程对象,把执行机会让给相同或者优先级更高的线程。
(5)线程加入:join()方法,等待其他线程终止,在当前线程中调用另外一个线程的join()方法,则当前线程转入阻塞状态,知道另一个线程执行结束,当前线程再由阻塞状态转为就绪状态。
(6)线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程,如果所有的线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生。线程通过调用其中一个wait()方法,在对象监视器上等待。直到当前的线程放弃此对象上的锁,才能继续执行被唤醒的线程。被唤醒的线程将以常规的方式与该对象上主动同步的其他所有的线程进行竞争cpu的使用权;例如:唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势-公平竞争。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。
特别说明:
Thread中的suspend()和resume()两个方法在JDK1.5中已经废弃,不再介绍,因为有死锁倾向。

原文地址:https://www.cnblogs.com/newwind/p/8901956.html

时间: 2024-08-16 09:53:52

多线程学习-基础(三)线程的调度的相关文章

Java多线程编程基础之线程对象

在进入java平台的线程对象之前,基于基础篇(一)的一些问题,我先插入两个基本概念. [线程的并发与并行] 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent).而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel). 在上面包括以后的所有论述中,请各位朋友谅解,我无法用最准确的词语来定义储

java多线程学习(三)——线程栈

一.线程栈模型 线程栈模型是理解线程调度原理以及线程执行过程的基础.线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶,线程栈的内容是随着线程的运行状态变化而变化的,研究线程栈必须选择一个运行的时刻(指代码运行到什么地方) 上图中的栈A是主线程main的运行栈信息,当执行new JavaThreadDemo().threadMethod();方法时,threadMethod方法位于主线程栈中的栈顶,在threadMethod方法中运行的start()方法新建立了一个线程,此时,

多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现

一.多线程模型一:生产者消费者模型   (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个"仓库"的概念,生产者消费者都是围绕着:"仓库"来进行操作,一个仓库同时只能被一个生产者线程或一个消费者线程所操作,synchronized锁住的也是这个仓库,仓库是一个容器,所以会有边界值,0和仓库可存放上限,在这个上限内,可以设置多种级别,不同的级别可以执行不同的策略流程. (3)本案例使用知识点: Thread.curre

多线程学习-基础(二)线程状态装换

一.线程状态转换 下面的这个图非常重要!你如果看懂了这个图,那么对于多线程的理解将会更加深刻 状态说明:(1)新建状态(New):新创建了一个线程对象.(2)就绪状态(Runnable):线程被创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行的线程池中,变得可运行,等待获取cpu的使用权限.(3)运行状态(Running):就绪状态的线程获取了cpu的使用权,执行程序代码.(4)阻塞状态(Blocked):阻塞状态是线程由于某种原因放弃了cpu的使用权,暂时停止运行,直到

多线程学习笔记四--------------线程间通信问题

线程间通信问题: 多个线程在处理同一资源,但是任务却不同: java中将资源共享的方法(思路): 1.方法或者变量静态化---->静态化后,在类加载的时候,会将其加载到内存的方法区进行共享 2.单例设计模式---->保证只对一个实例进行操作. 3.将资源作为操作该资源的类的构造函数的参数,这样可以保证此类的多个对象在使用该资源的时候使用该资源的同一个实例. 现在我们要用第三种方法来进行线程间的通信. 情景:两个线程 ,一个负责输入,一个负责输出:共同处理一个资源. public class T

多线程学习笔记六-------------线程的消亡以及一些常用方法的介绍

多线程wait()和sleep()的区别: 1.wait()可以指定时间,sleep()必须指定时间. 2.在同步中时,对cpu的执行权和处理不同. wait() 释放执行权,释放锁. sleep() 释放执行权,不释放锁. 在同步锁中(synchronized),多线程可能同时进入锁中(多生产者多消费者问题),都被wait(),此时这些线程都释放了执行权并且释放了锁. 当有notifyAll()将其唤醒的时候,这些线程都获得了执行权,只有当执行notifyAll()的线程执行完同步锁内的内容的

java多线程学习-同步之线程通信

这个示例是网上烂大街的,子线程循环100次,主线程循环50次,但是我试了很多次,而且从网上找了很多示例,其实多运行几次,看输出结果并不正确.不知道是我转牛角尖了,还是怎么了.也没有大神问,好痛苦.现在记录在这里,等以后有时间看. import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; p

JAVA多线程学习笔记<3>线程传入参数与终止线程方法

public class TimeThread extends Thread { private long start; public volatile boolean exit = false; public TimeThread(long start) { this.start = start; } public void run() { while(!exit) { long end = System.currentTimeMillis(); long useTime = end - st

多线程学习笔记三--------------多线程死锁

多线程死锁: 死锁的常见情形之一:同步的嵌套. public class DeadLock { public static void main(String[] args) throws InterruptedException { Customer cus = new Customer(); Thread t1 = new Thread(cus); Thread t2 = new Thread(cus); t1.start(); Thread.sleep(5); cus.flag = fals