1、sleep()
使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。
例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完毕后,低优先级的线程才能够执行;但是高优先级的线程sleep(500)后,低优先级就有机会执行了。
总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。
2、join()
join()方法使调用该方法的线程在此之前执行完毕,也就是等待该方法的线程执行完毕后再往下继续执行。注意该方法也需要捕捉异常。
3、yield()
该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。
4、wait()和notify()、notifyAll()
这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用。synchronized关键字用于保护共享数据,阻止其他线程对共享数据的存取,但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。
wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
注意 这三个方法都是java.lang.Object的方法。
二、run和start()
把需要处理的代码放到run()方法中,start()方法启动线程将自动调用run()方法,这个由java的内存机制规定的。并且run()方法必需是public访问权限,返回值类型为void。
三、关键字synchronized
该关键字用于保护共享数据,当然前提条件是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问到该对象,被Synchronized修饰的数据将被"上锁",阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。
四、wait()和notify(),notifyAll()是Object类的方法,sleep()和yield()是Thread类的方法。
(1)、常用的wait方法有wait()和wait(long timeout);
void wait() 在其他线程调用此对象的 notify() 方法或者 notifyAll()方法前,导致当前线程等待。
void wait(long timeout)在其他线程调用此对象的notify() 方法 或者 notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。
wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其他shnchronized数据可被别的线程使用。
wait()h和notify()因为会对对象的“锁标志”进行操作,所以他们必需在Synchronized函数或者 synchronized block 中进行调用。如果在non-synchronized 函数或 non-synchronized block 中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。。
(2)、Thread.sleep(long millis)必须带有一个时间参数。
sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;
sleep(long)可使优先级低的线程得到执行的机会,当然也可以让同优先级的线程有执行的机会;
sleep(long)是不会释放锁标志的。
(3)、yield()没有参数
sleep 方法使当前运行中的线程睡眠一段时间,进入不可以运行状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。
yield()也不会释放锁标志。
实际上,yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。
sleep 方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,所以不可能让出较低优先级的线程此时获取CPU占有权。在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。
yield()只是使当前线程重新回到可执行状态,所有执行yield()的线程有可能在进入到可执行状态后马上又被执行,所以yield()方法只能使同优先级的线程有执行的机会
相关推荐
Java 线程详解 在 Java 编程语言中,线程是一种基本的编程单元,它允许开发者在一个程序中执行多个任务。线程是轻量级的进程,它可以与其他线程共享同一个进程的资源。线程的使用可以提高程序的效率和响应速度。 ...
本文将详细解析Java中的线程让步方法`yield()`以及线程休眠方法`sleep()`,并与线程等待的`wait()`方法进行对比。 首先,线程让步`yield()`方法的主要作用是让当前线程主动放弃执行权,让其他处于就绪状态且具有...
### Java线程培训资料知识点详解 #### 一、Java线程基本概念 1. **如何编写与启动线程** - **方式一:继承Thread类** ```java class MyThread extends Thread { @Override public void run() { // 业务逻辑 ...
本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者逐步掌握这一关键技能。 1. **线程简介** - 线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程,它们...
在Java中,**线程**是一种轻量级的进程,它允许一个程序同时执行多个任务,从而提高程序的执行效率。Java从1.0版本开始就支持多线程编程,并在后续版本中不断完善。Java线程可以通过继承`java.lang.Thread`类或实现`...
Java多线程与同步是Java编程中的核心概念,它们在构建高效、响应迅速的应用程序时起着至关重要的作用。在大型系统开发中,多线程技术使得程序能够同时执行多个任务,提高系统的并发性,而同步机制则确保了在多线程...
### Java多线程编程详解 #### 一、线程的同步机制 在Java多线程编程中,线程之间的同步是非常重要的概念。由于同一进程中的多个线程共享相同的内存空间,这可能导致数据竞争条件(race condition)的问题。为了...
在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。这篇博文详细介绍了这两种方法以及它们之间的差异。 1. 继承Thread类 当一个类直接继承自Thread类时,可以通过重写run()方法来定义线程的...
- **线程模型**:Java中的线程模型主要包括线程对象、线程状态、线程同步机制等。 - **线程对象**:通过`java.lang.Thread`类或实现`Runnable`接口创建线程。 - **线程状态**:Java线程有六种状态:NEW(新建)、...
在Java中,线程的创建通常有两种方式:通过继承`Thread`类或实现`Runnable`接口。 1. **继承Thread类**:创建一个新的类继承自`Thread`类,并重写`run()`方法。在`run()`方法中编写线程执行的逻辑。然后通过创建该...
Java中的线程机制是其一大亮点之一,它直接支持线程级别的并发处理。线程相比于进程具有创建成本低、上下文切换快等优势,这使得Java在处理高并发场景时能够表现出色。然而,线程的使用对开发者提出了较高的要求,...
线程状态的转换由操作系统或Java虚拟机(JVM)内部机制控制,如调用`sleep()`、`wait()`等方法会使线程进入阻塞或等待状态,而调用`notify()`、`notifyAll()`等方法则可唤醒处于等待状态的线程。 #### Java线程:线程...
Java中实现多线程主要有两种方式:**继承Thread类**与**实现Runnable接口**。 1. **继承Thread类**: - 创建一个新的类继承自`Thread`类,并重写`run`方法。 - 通过创建该类的实例并调用`start()`方法启动线程。 ...
在Java中实现多线程的一个方式是通过继承`java.lang.Thread`类。这种方式简单直观,但也有一定的局限性,比如不能再次继承其他类。 **示例代码**: ```java class Thread1 extends Thread { private String name;...
在Java中,多线程可以通过继承Thread类或实现Runnable接口来实现。下面我们将深入探讨Java多线程编程的相关知识点。 1. **线程的创建** - **继承Thread类**:创建一个新类,继承自Thread类,然后重写run()方法,...
在Java中,可以通过实现`Runnable`接口或继承`Thread`类来创建线程。 2. **线程的生命周期**: 线程有新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)五个状态。理解这些...
线程状态的变化通常由操作系统内核控制,但在Java中也可以通过调用特定方法(如`wait()`、`sleep()`、`join()`)来触发。 #### 五、线程的同步与锁 线程同步是为了解决多线程环境下的资源共享问题,防止数据竞争和...
《Java高并发编程详解:多线程与架构设计》是一本深入探讨Java中多线程编程和并发架构的书籍,适合Java开发者和架构师阅读。本书分为四个部分,旨在帮助读者掌握Java并发的核心技术和设计原则。 第一部分是多线程...