java多线程学习(四)——线程的交互

线程交互中用到的三个基本函数:

void notify();唤醒在此对象监视器上等待的单个线程。

void notifyAll();唤醒在此对象监视器上等待的所有线程。

void wait();导致当前的线程等待,直到其他线程调用此对象的notify()或者notifyAll()方法。

void wait(long timeout);wait()的重载版本,同样导致当前线程等待,直到其他线程调用此对象的notify()或者notifyAll()方法,或者等待超过指定的时间后不再等待。

void wait(long timeout,int nanos);wait()的重载版本,同样导致当前线程等待,直到其他线程调用此对象的notify()或者notifyAll()方法,或者等待超过某个实际的时间后不再等待,或者其他某个线程中断当前线程。

在线程交互中需要注意的是:

wait()、notify()、notifyAll()方法必须从同步环境中调用,线程不能调用对象上等待或通知的方法,除非此线程拥有对象的锁。

线程通过执行对象上的wait()方法获得等待列表,此后线程不再执行任何其他指令,直到调用对象的notify()方法为止。当多个线程在同一个对象上等待的时候,则notify()将随机的唤醒其中的一个线程来使其运行。若没有线程等待,则不做任何处理。

要执行wait()方法,前提是当前线程拥有此对象的锁,当执行wait()方法之后,此线程即释放此对象的锁,以便于其他线程中调用notify()或者notifyAll()来唤醒此线程。然而调用notify()时,不意味着线程会释放对象的锁。如果线程依然在完成同步代码,那么线程在完成同步代码块时不会释放对象的锁。所以,notify()并不意味着锁变得可用。

注意的问题:

wait(),notify(),notifyAll()不属于Thread类,而属于Object类,也就是说每个对象都有着三个方法。因为每个对象都有自己的锁,锁是每个对象的基础,操作锁的方法也是每个对象的基础。

wait()导致的是当前的线程的等待,而不是调用对象所在的线程类等待,也就是哪个线程拥有此对象的锁才能调用wait()方法。

notify()唤醒当前对象监视器上等待的单个线程,如果在此对象上有多个线程在等待,则随机的唤醒期中一个线程,直到当前线程放弃此对象上的锁,才能继续执行被唤醒的线程。notify()也和wait()一样,必须由持有此对象的锁的线程来调用,notifyAll()也一样,但是notifyAll()会唤醒在这个对象等待的所有线程,并从这个线程中随机的选择一个。

这三个方法都需要和synchronized配合使用,也就是必须先获取对象的锁,才能调用者三个方法。

时间: 2024-08-27 16:39:30

java多线程学习(四)——线程的交互的相关文章

Java多线程学习之线程的状态及中断线程

线程的状态 新建(new):当线程被创建时,它只会短时间处于这种状态.它已经分配了必要的系统资源,完成了初始化.之后线程调度器将把这个线程转变为可运行或者阻塞状态: 就绪(Runnable):在这种状态下,只要调度器分配时间片给线程,线程就可以运行了: 阻塞(Blocked):有某个条件阻止线程运行,调度器将忽略阻塞状态的线程,不会分配时间片给它,直到线程进入就绪状态,它才有可能执行: 死亡(Dead):处于死亡或者终结状态的线程将不再是可调度的,并且也不会被分配到时间片.任务死亡的方式通常是从

Java多线程学习之线程的同步

多线程编程要解决的一个基本问题是:共享资源的竞争.而基本上使用并发模式在解决这个问题都采用序列化访问共享资源的方法.基本原理就是当共享资源被一个任务使用时,在其上加锁,其他任务在资源被解锁之前,无法访问它.在任务对其解锁后,另一个任务就可以锁定并使用它.下面看看Java支持的线程同步机制. 1.synchronized关键字 synchronized关键字即可应用于对象相关的同步,也可用于类层次的同步(static属性): 对象上应用synchronized可以实现对象方法的同步和代码块的同步.

Java多线程学习之线程的取消与中断机制

任务和线程的启动很容易.在大多数情况下我们都会让他们运行直到结束,或是让他们自行停止.但是,有时我们希望提前结束任务或是线程,可能是因为用户请求取消,或是线程在规定时间内没有结束,或是出现了一些问题迫使线程要提前结束. 强制一个线程或是服务立即停止,可能会造成共享数据状态不一致的问题,比如,两个线程正对一个共享数据进行操作,然后被突然杀死,这样会对数据造成不确定性的影响.Java中没有提供任何机制来安全的终止线程,但它提供了中断,这种协作机制,“提醒”线程可以自己结束自己线程.这种机制提供了更好

Java多线程(四)、线程池(转)

Java多线程(四).线程池 分类: javaSE综合知识点 2012-09-19 17:46 3943人阅读 评论(1) 收藏 举报 系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似的是,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象传给线程池,线程池就会启动一条线程来执行该对象的run方法,当run方法执行结束后,该线

“全栈2019”Java多线程第四章:设置和获取线程名称

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四章:设置和获取线程名称 下一章 "全栈2019"Java多线程第五章:线程睡眠sleep()方法详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Jav

“全栈2019”Java多线程第四十二章:获取线程与读写锁的保持数

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十二章:获取线程与读写锁的保持数 下一章 "全栈2019"Java多线程第四十三章:查询是否有线程在等待读写锁 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&quo

“全栈2019”Java多线程第四十六章:判断任意线程是否已持有写锁

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第四十六章:判断任意线程是否已持有写锁 下一章 "全栈2019"Java多线程第四十七章:判断锁是否为公平锁isFair() 学习小组 加入同步学习小组,共同交流与进步. 方式一:加入编程圈子. 方式二:关注头条号Gorhaf,私信"Java学习小组". 方式三:关

[转]Java多线程学习(总结很详细!!!)

Java多线程学习(总结很详细!!!) 此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢? 本文主要讲java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的线程函数用法.概述等.首先让我们来了解下在操作系统中进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,

java SE学习之线程同步(详细介绍)

       java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题:               当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量时,那么这个程序是该如何执行?              也就是先访问这个变量还是先修改这个变量.              在学习线程的这段时间里,我也一直被这个问题所困扰!但是今天终于算是搞明白了.              于是将这些好的列子一一列举出来,分享一下. (1)什么是线程同步 ?