`
youyu4
  • 浏览: 424704 次
社区版块
存档分类
最新评论

Java多线程之线程调度

 
阅读更多

Java多线程之线程调度

 

线程优先级

 

Java线程有优先级,优先级高的线程会获得较多的运行机会(就像高富帅)。

 

Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:

 

  • static int MAX_PRIORITY:线程可以具有的最高优先级,取值为10。
  • static int MIN_PRIORITY: 线程可以具有的最低优先级,取值为1。
  • static int NORM_PRIORITY:分配给线程的默认优先级,取值为5。

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

 

线程优先级特点

 

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

 

 

多线程常用方法

 

      1. 线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

 

      2. 线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0) 一样。

 

      3. 线程让步:Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。

 

      4. 线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。

 

      5. 线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。

 

      6. 终止线程:stop(),不推荐使用,无论线程执行到哪里,它都会立刻停止掉线程。当线程写完id = 1,再准备写name = 11时被stop(),释放锁。读线程获得锁进行读操作,读到id = 1,name = 0,数据不一致。

重点是这种错误不会抛异常,将很难发现。

 

 

 

方法的区别

 

yield和sleep的区别

 

  • sleep有时间,yield没有,所以调用yield后可能马上又会回到运行状态
  • sleep会抛异常,yield不会
  • 两者都不会释放锁,只有wait会释放锁

 

sleep和wait的区别

 

  • sleep和wait都可以通过interrupt()打断暂停状态,抛InterruptException
  • sleep没有释放锁,wait释放了锁
  • wait只能在同步方法、同步块中使用,sleep可以在任何地方使用(因为wait和notify都需要获得和释放锁)
  • Thread.sleep()     Thread.yield()
  • Object.wait()         Object.notify()

 

 

为什么wait和notify都不在Thread类中

 

       因为这些方法是对对象的锁进行操作,因为锁属于对象,不是说让线程停多久,而是直接拿走对象的锁,notify也是一样,把一个锁打开,让一个线程或所有线程知道。

 

 

notify和notifyAll的区别

       

  • notify:所有人等吃饭,A收到吃饭消息,去窗口打饭,其他人都在等吃饭消息
  • notifyAll:通知所有人吃饭消息,让他们排队打饭

 

 

常用到的方法如下:

 

       sleep(): 强迫一个线程睡眠N毫秒。 

  isAlive(): 判断一个线程是否存活。 

  join(): 等待线程终止。 

  activeCount(): 程序中活跃的线程数。 

  enumerate(): 枚举程序中的线程。 

       currentThread(): 得到当前线程。 

  isDaemon(): 一个线程是否为守护线程。 

  setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束) 

  setName(): 为线程设置一个名称。 

  wait(): 强迫一个线程等待。 

  notify(): 通知一个线程继续运行。 

  setPriority(): 设置一个线程的优先级。

分享到:
评论

相关推荐

    Java多线程编程总结

    Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-...

    java多线程编程总结

    详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...

    java多线程笔记

    Java线程:线程的调度-终止线程 25 Java线程:线程的调度-守护线程 28 Java线程:线程组 30 Java线程:线程的同步 33 一、 同步方法 35 二、 同步块 36 三、 volatile关键字 38 四、 使用synchronized关键字要注意...

    java多线程处理大数据

    java多线程处理大数据,可根据配置的线程数,任务去调度处理

    java多线程与进程调度

    java多线程与进程调度,针对多线程和进程的讲解

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    java多线程导出excel(千万级别)优化

    轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着

    基于java swing的多线程电梯调度模拟

    操作系统多线程的作业,模拟多个电梯的调度机制。使用jdk11开发环境。

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition....第七章 Java线程调度例子 第八章 和同步相关的高级主题 第九章 多处理器机器上的并行化 第十章 线程组

    Java多线程编程详解

    在这一讲中,我们一起学习了 Java 多线程编程的方方面面,包括创建线程,以及对多个线程进行调度、管理。我们深刻认识到了多线程编程的复杂性,以及线程切换开销带来的多线程程序的低效性,这也促使我们认真地思考一...

    线程调度模拟电梯

    操作系统课程上的线程调度作业,电梯模拟程序

    java多线程并发演示

    实现多线程的并发执行,能演示操作系统的时间转轮调度算法对多线程程序执行的影响效果,能控制一个或多个线程的执行情况。

    轻量级java多线程池demo

    线程可相互通信,可任意调度任务,类似Akka的Actor。如果内容对您有帮助,微信扫描下方的二维码支持下作者,谢谢!

    java面试题之多线程

    J2EE面试题之多线程的问题几乎都在这.

    Java电梯调度程序

    使用Java模拟操作系统中线程调度的原理,界面简洁清晰。类的设计巧妙易懂。欢迎下载。

    Elevator.rar_java_java多线程电梯_throughca8_电梯 多线程_电梯调度

    实现了多线程电梯的调度算法(3部电梯统一进行调度)

    解析Java的多线程机制

    而Java应用程序中的多线程则是共享同一应用系统资源的多个并行代码执行 体,线程之间的通信和协调方法相对简单。 可以说:Java语言对应用程序多线程能力的支持增强了Java作为网络程序设计语言的优势,为实现分布式...

    Java多线程的调度_动力节点Java学院整理

    有多个线程,如何控制它们执行的先后次序呢?下文给大家分享四种方法及java多线程调度的实例代码,需要的朋友参考下吧

Global site tag (gtag.js) - Google Analytics