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

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中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    java多线程处理大数据

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

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

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

    总的来说,这个项目涉及到Java多线程编程、GUI设计、对象间的通信以及线程同步等多个核心概念,是学习和实践Java并发编程的好例子。通过理解和分析这个项目,开发者不仅可以深入理解Java的并发机制,还能掌握如何在...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

    武汉理工大学Java多线程实验源码

    Java多线程是Java编程中的核心概念,尤其在并发编程领域有着重要的地位。这个实验源码来自武汉理工大学的大二上学期Java课程,旨在帮助学生深入理解并实践Java的多线程技术。 首先,我们来看看“CTExp01”到“CTExp...

    Java 多线程 PPT

    Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...

    Java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...

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

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万级别的数据时。传统的Apache POI库在处理大规模数据时可能会遇到栈溢出(StackOverflowError)和内存溢出(OutOfMemoryError)等问题,因为这些...

    java多线程.pdf

    ### Java多线程知识点详解 #### 一、Java多线程概述 **Java多线程**是指在Java程序中能够同时执行多个线程的技术。这种技术使得程序可以在多个任务之间并发执行,从而提高了程序的效率和资源利用率。本文将根据...

    java 多线程示例

    Java多线程是Java编程中的重要概念,尤其在开发高性能、高并发的应用中不可或缺。本示例旨在为初学者提供一个全面理解Java多线程的起点。通过学习这个实例,你可以掌握如何创建和管理线程,理解线程同步与通信的重要...

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。

    java 多线程课件

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应速度。在Java中,多线程支持是语言级别的,这意味着开发者可以轻松地创建和管理并发执行的线程。 首先,我们要理解...

    精通java多线程

    Java多线程是Java编程语言中的一个重要特性,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多核处理器的普及使得多线程技术成为提升性能的关键手段。本篇将深入探讨Java多线程...

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

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

Global site tag (gtag.js) - Google Analytics