多线程(第三天)

线程必须有与调用的实例的锁定,才能执行notify方法,这点跟wait方法一样(也是规则)

notify后的线程

被notify唤醒的线程并不是在notify的一瞬间重新开始执行。因为在notify的那一刻,执行notify的线层还握着锁定不放,所以其他线程无法获取该实例的锁定

notify如何选择线程

假设执行notify方法时,wait set 里正在等候的线程不只是一个。规格里并没有注明此时该选择哪一个线程。究竟是选择等待线程列表中的第一个,随即选择或是另以其他方式选择,则依java处理系统而异,因此在写程序时,程序属性最好不要写成会因所选线程而有所变动

notifyAll  从wait set中拿出所有线程

使用notifyAll(通知全体)方法时,会将所有在wait set里苦等的线程都拿出来,假设现在的情况是

obj.notifyAll();

则会唤醒所有留在实例obj的wait set 里的线程

若实例方法写成notifyAll();

则其意义同

this.notifyAll();

故这个语句所在的方法的实例(this)的wait set里的线程会全部放出来

notify 只唤醒一个线程 ,然后该线程推出wait set     notifyAll  唤醒所有线程  让他们全部退出wait set

跟wait 方法和notify 方法一样, 线程必须获取欲调用notifyAll方法

被唤醒的线程边开始去获取刚才进入wait时释放掉的锁定,那么,这个锁定现在是在刚才执行notifyAll方法的线程手里

因此即使所有线程都已经退出wait set ,但他们仍然在去获取所定的状态下,还是有阻挡,要等到刚才执行notifyAll方法的线程释放出锁定之后,其中一名幸运儿才能实际执行

若没有锁定的线程去调用 wait notify  notifyAll 时,便会抛出异常 java.lang.IllegalMonitorStateException

notify 和notifyAll  选择

notifyAll所写出来的程序代码会比 notify可靠  不容易挂掉

线程少时,notify 的程序处理速度比较快

wait notify notifyAll 是Object 类的方法

wait notify notifyAll都是 java.lang的Object类的方法,不是Thread类固有的方法

obj.wait()是把现在的线程放到obj的wait set

obj.notify()是从obj的wait set 里唤醒一个线程

obj.notifyAll()是唤醒所有在obj的wait set 里的线程

均解释为对实例wait set的操作,所有实例都会有 wait set 所以wait notify notifyAll才会是Object类的方法。

三者确实不是Thread类固有的方法。不过因为 Object类是祖先类,所以 他们也是Thread类的方法

取消线程处理的中断

Interrupt isInterrupt interrupted interruptedException

线程的优先级

setPriority getPriority

等候线程结束

join

有阻挡和被阻挡

有时候线程会因为某种因素而无法继续进行下去。当线程A欲执行synchronized方法时,若其他方法已获取相同实例的锁定,则线程A无法向前推进,这个状态称为“线程A有阻挡”,,,,与被阻挡意思相同

时间: 2024-11-03 22:20:15

多线程(第三天)的相关文章

Java 多线程(三) 线程的生命周期及优先级

Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: 当用new操作符创建一个新的线程对象时,该线程处于创建状态. 处于创建状态的线程只是一个空的线程对象,系统不为它分配资源. 2.可运行状态: 执行线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体——run()方法,这样就使得该线程处于可运行状态(Runnable). 这一

Java多线程(三)、线程同步(转)

Java多线程(三).线程同步 分类: javaSE综合知识点 2012-09-18 17:59 2400人阅读 评论(0) 收藏 举报 在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的控制吧. 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数

python多线程(三)

原文:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html 一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: import time import thread def timer(no, interval): cnt = 0 while cnt<10: print 'Thr

“全栈2019”Java多线程第三十章:尝试获取锁tryLock()方法详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第三十章:尝试获取锁tryLock()方法详解 下一章 "全栈2019"Java多线程第三十一章:中断正在等待显式锁的线程 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复

“全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第三十五章:如何获取线程被等待的时间? 下一章 "全栈2019"Java多线程第三十六章:如何设置线程的等待截止时间 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&qu

线程的状态以及创建多线程的三种方式

首先了解一下线程的五种状态: 新建状态: 新建状态是指new之后,即新创建了一个线程的时候,此时并未运行任何线程方法体内的程序代码. 就绪状态: 简单来说就是指程序调用了start()之后,线程就得到了启动,代表线程进入了就绪状态,但是此时并不代表它会立刻去执行run()方法体内的程序代码,而是随时等待cpu的调度. 运行状态: 获得cpu的时间后,调用run()方法,进入运行状态. 阻塞状态: 由于某种原因放弃了cpu的会用权力,暂时停止运行,等待再次被调用. 死亡状态: 线程正常执行完毕,或

java实现多线程的三种方式

java中实现多线程的方法有两种:继承Thread类和实现runnable接口 1.继承Thread类,重写父类run()方法   public class thread1 extends Thread {           public void run() {                 for (int i = 0; i < 10000; i++) {                         System.out.println("我是线程"+this.get

秒杀多线程第三篇 原子操作 Interlocked系列函数

版权声明:本文为博主原创文章,未经博主允许不得转载. 上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是否运行出错.这也非常类似于统计一个网站每天有多少用户登录,每个用户登录用一个线程模拟,线程运行时会将一个表示计数的变量递增.程序在最后输出计数的值表示有今天多少个用户登录,如果这个值不等于我们启动的线程个数,那显然说明这个程序是有问题的.整个程序代码如下:

Java多线程(三)volatile域

相关文章 Java多线程(一)线程定义.状态和属性 Java多线程(二)同步 Android多线程(一)线程池 Android多线程(二)AsyncTask源码分析 前言 有时仅仅为了读写一个或者两个实例域就使用同步的话,显得开销过大,volatile关键字为实例域的同步访问提供了免锁的机制.如果声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的.再讲到volatile关键字之前我们需要了解一下内存模型的相关概念以及并发编程中的三个特性:原子性,可见性和有序性

Java总结篇系列:Java多线程(三)

一.一个典型的Java线程安全例子 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 Account account = new Account("123456", 1000); 5 DrawMoneyRunnable drawMoneyRunnable = new DrawMoneyRunnable(account, 700); 6 Thread myThread1 = new Thr