1 线程中的几个方法解释

Thread.sleep(long 毫秒)

在指定的时间内让当前线程休眠,将控制权交给其他线程,休眠的线程依旧拥有它所占用的锁,

Thread.yield();

暂停或者放弃当前正在执行的线程,并且执行其他线程,但是并没有释放该线程所拥有的锁,线程放弃后,让其他相同或者更高线程得以运行。

t.join()

在A线程中等待t线程,可以指定一定时间后继续执行或者无限等待

t.interrupt()

中断t的线程,可以唤醒打断处于sleep,join和wait状态下的线程,

p.wait()

线程可以等待一个它锁定的对象,在等待的时候,它会释放此对象的锁并且暂停进入休眠,它会在时间到期、该线程被中断和对象得到通知之前一直保持休息。直到它得到了其他线程的通知,如该对象调用notify()和notifyAll()的时候才会执行。

对于使用wait和notify与notifyAll的时候均要先利用同步代码块或者同步方法获取该对象的锁,利用wait后,会首先获取该对象锁,然后进入该对象的wait set中,暂停当前的线程,释放该对象的锁,在该对象的wait set等待着

对于直接wait()就是this.wait(),执行wait()的线程会在this的wait set中等待着。

Yield和Sleep区别

sleep 方法使当前运行中的线程睡眠一段时间,进入不可以运行状态,这段时间的长短是由程序设定的,它只有被吵醒或者睡眠时间到才会继续运行;

yield方法使当前线程让出CPU占有权即时间片,重新排队,但让出的时间是不可设定的,该线程依然是可运行状态

yield()方法对应了如下操作:先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给该线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。

sleep 方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,它在队列中等候cpu调用,所以说是可运行状态(注意不是运行状态),所以不可能让出较低优先级的线程此时获取CPU占有权。在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。

yield()只是使当前线程重新回到可运行状态,所有执行yield()的线程有可能在进入到可运行状态后马上又被执行,所以yield()方法只能使同优先级的线程有执行的机会
2 线程的启动

线程的启动永远都是调用Start()方法开始的, Thread.start ()方法启动线程,使之进入就绪状态,当 cpu 分配时间片给该线程时,由 JVM 调度执行 run ()方法, 之所以要start和run方法的原因是,因为 JVM 创建一个单独的线程不同于普通方法的调用,启动一个线程是由start 方法完成,start 由本地方法实现,需要显示地被调用。Run方法是真正执行的任务部分,另一个好处就是在于当一个对象需要继承多类的时候,此时就可以将具体的任务实现了 Runnable 接口,然后传递给Thread中,避免因继承了 Thread 类而造成的 Java 的多继承问题。

对于同一个Thread类的实例变量,只能调用一次Start方法,一旦调用start方法,就会变成结束start状态,当其再次调用start方法的时候,就会出现IllegalThreadStateException,就会进行退让让线程的启动不会再次执行。Thread类的start方法采用的就是Balking Pattern模式。

多线程都是针对多个线程操作同一个对象下作用的。

3 Single Threaded Execution Pattern

Single Threaded Execution指的就是“只允许一个线程执行”的意思,它表明对于调用这个方法或对象的时候必须只能让一个线程来执行。利用synchronized来设置对象的监听器,在synchronized方法体或者同步块中。必须要注意synchronized实例方法共享的是类的实例对象的锁,而synchronized类方法即static synchronized的方法共享的是类的锁,这两把锁完全不同。

对于一个对象的某一个方法,当有多个线程需要访问的时候,这些线程是共享这个对象的所有成员属性的。线程是共享这个对象的内存。

Single Threaded Execution中,作为共享资源的类,即可以被多个线程访问的。有两种方法,安全方法和非安全方法,所谓的安全方法就是多个线程调用也不会出现问题。而非安全方法在多个线程访问的过程可能会出现问题。需要对于非安全方法做处理。
适用性:当共享资源类的实例可能被多个线程访问的时候,实例的状态即属性会被修改,在多个线程中,此时就需要对于对于实例的状态发生变化的范围作为临界区,利用synchronized来保护,实现临界区间,来监听多线程的访问。

4 Immutable Pattern

Immutable Pattern指的就是“有着能够保证实例的状态绝不会发生变化更改的类”,再次说明这里指实例的状态都是指的是类的成员属性。所谓的不能发生变化,也就是对于类的状态只允许赋值一次,且不会给外界提供任何setter方法,并且属性是private final,一般通过在构造器来对于这些状态赋值,当然也可以将类声明为final。利用这种方式,就克服利用共享互斥机制来造成的时间浪费。

Immutable Pattern参与者是一个字段值无法更改的类,也没有任何用来更改字段值的方法。当Immutable参与者的实例一旦创建后,状态就固定下来,无法更改了。
适用性:当实例产生后,状态不再发生变化。实例需要多个线程共享,访问很频繁的时候。

5 Guarded Suspension Pattern--要等到我准备好再通知你们哟

  Guarded Suspension指的意思是“在多线程中,当线程访问某一个资源时候,此时并不适合马上执行某个操作时,就要求想要执行该操作的线程必须等待。”Guarded是“被保护的”,suspension是“暂停”的意思。

Guarded Suspension要求线程必须等待。利用的就是wait,再通过notifyAll来通知所有等待的线程。将线程要执行某一个操作,必须满足的条件称为警戒条件。每个线程在执行的时候,如果不满足警戒条件就必须在等待,只有收到通知后,判断警戒条件成功后,才能进而执行所要的目的操作。

常用的警戒条件结构如下:

public synchronized void methodName()

{

while(警戒条件的否定)

使用wait;//这里直接在共享类中wait,所有等待的都会进入该类实例的this wait set中等候

//跳出循环,说明满足警戒条件

执行目的操作。

}
注:不能将while替换为if,因为凡是处于等待中的线程一旦获得唤醒,就必须在执行目的操作之前先进行警戒条件的判断才能进而执行目的操作。必须将捕获wait的异常包括在while循环体中,否则一旦发生异常可能就会进而执行目的操作。这里的wait也不能换为sleep,因为利用sleep该线程会一直拥有它所获得锁。

在这里wait和notify都是隐藏在共享资源中,这样凡是使用该共享资源的线程就不需要考虑这些问题了。

GuardedObject参与者是一个拥有被防卫的方法guardedMethod,一般就是利用synchronized来修饰,在线程执行这个方法的时候,只要满足警戒条件就会执行,否则就会一直等待。警戒条件会随着实例的状态变化而变化。还需要一个更改实例状态的方法stateChangingMethod,来通知那些等待的线程。

一般使用while语句和wait方法来实现guardedMethod,使用notify和notifyAll来实现stateChangingMethod

6 Balking Pattern

Balking Pattern指的是“多线程访问共享资源时候,当现在不适合进行这个操作,或者没有必要进行这个操作的时候,此时就会直接放弃进行这个操作而返回”。

Balking Pattern也是需要警戒条件的。GuardedObject参与者是一个拥有被防卫的方法guardedMethod,一般就是利用synchronized来修饰,在线程执行这个方法的时候,只要满足警戒条件就会执行,否则就会。警戒条马上返回,直接退出该方法。警戒条件的成立会随着实例的状态变化而变化。还需要一个更改实例状态的方法stateChangingMethod,来通知那些等待的线程。

警戒条件的结构:

public synchronized void guardedMethod()

{

if(警戒条件否定)

return ;

//警戒条件满足情况

目的操作

}
适用性:在线程访问警戒条件不成立的时候,不需要刻意执行等待的时候,不想一直等待警戒条件成立的时候,或者警戒条件只有第一次成立的时候。注意线程的start方法就是利用这种方式的,即只有第一次成立的时候才会调用,第二次调用就会出错。

转载于:https://blog.51cto.com/computerdragon/1201769

Java多线程设计模式(1)相关推荐

  1. 图解Java多线程设计模式

    图解Java多线程设计模式 1-4章 第一部分 第五章 生产者与消费者 第六章 读写锁 7.8.9章 第三部分 第十章 Two-phase Termination 想要结束运行中的线程 ,这张有问题, ...

  2. java多线程设计模式详解

    Java多线程设计模式 线程的创建和启动 Java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就 ...

  3. 图解Java多线程设计模式——Java多线程基础

    文章目录 简介 线程的启动 线程启动(1)--利用Thread类的子类 线程启动(2)--利用Runnable接口 利用ThreadFactory新启动线程 线程的暂停 线程的互斥处理 synchro ...

  4. java多线程设计模式详解[推荐]

    java多线程设计模式详解[推荐] java多线程设计模式详解之一 线程的创建和启动 java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run ...

  5. 图解多线程设计模式pdf_图解Java多线程设计模式阅读计划-图灵社区.PDF

    图解Java多线程设计模式阅读计划-图灵社区 Java --1 Java Java 13 D API java.util.concurrent Java Java 3 321 20:00-22:00 ...

  6. Java多线程设计模式之顺序控制-两个小案例

    Java多线程设计模式之顺序控制-两个小案例 案例一 两个线程,保证B线程执行完毕后再让A线程执行 思路一:使用wait/notify,需要synchronized关键字支持 思路二:使用LockSu ...

  7. Java多线程设计模式(4)线程池模式

    前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将"委托消息的一端"和"执行消息的一端&qu ...

  8. JAVA多线程设计模式篇 1、什么是多线程设计模式

    文章目录 1. 从物种进化说起 2. 十二种武器 总结 1. 从物种进化说起 寒武纪时期之前,所有的生物都没有进化出眼睛,突然有一天,许多生物们都开始有了视觉.能看见多姿多彩的世界,周围的环境.敌人和 ...

  9. java — 多线程设计模式

    前言: 本文章为作者原创,转载请注明出处,如该文章有技术问题,请指教,不胜感激.. 0528 一:多线程设计模式: 1.几种线程设计模式: 单例模式 不变模式 Future模式 生产者消费者模式 2. ...

  10. Java多线程--设计模式(二、Immutable Object(不可变对象)模式)

    一.Immutable Object 模式简介 多线程共享变量的情况下,为了保证数据的一致性,往往需要对这些变量的访问进行加锁.而锁本身又会带来一些问题和开销.Immutable Object 模式使 ...

最新文章

  1. 保护隐私的 Structure-from-Motion (SfM)
  2. HDLBits 系列(3)Priority Encoder(Case/Casez)
  3. RabbitMQ之TTL(Time-To-Live 过期时间)
  4. Yii 2 美化 url
  5. 国网的“好管家”——业务可视化管理平台
  6. 11月14日filter与在web开发中集成spring培训日记
  7. Makefile文件(六)_使用条件判断
  8. echarts 获取点击的y轴数值_ECharts关系图
  9. 内江机器人编程_编写程序 互动世界——内江二中高品质创客教育活动课获市直三区信息技术教师点赞...
  10. canvas 实现图片添加水印
  11. bin文件合并工具(UBIN)使用方法
  12. flash在C#中的应用
  13. educoder算法设计与分析 实验一扩展 袋鼠过河问题
  14. springboot中如何使用RedisTemplate存储实体对象
  15. 统计学学习日记:L5-离散趋势分析之异众比率与四分位差
  16. CNC脱机源代码 USB雕刻机CNC 3联动 步进电机控制器CNC脱机源代码
  17. [LUOGU] P4363 [九省联考2018]一双木棋chess
  18. USBKEY全解析---证书导入(java)
  19. python读什么-python读什么
  20. FFmpeg合并多个视频

热门文章

  1. 从0开始配置Flutter并运行demo
  2. 射影几何笔记3:中心射影-透视射影
  3. c语言中div函数,C 库函数
  4. 如何看exe文件源代码_杀进程、删文件...看新型勒索软件RobbinHood如何干掉杀毒软件...
  5. order by 空值排在最后_当梅根·马克尔最后一次皇室活动选择选择翡翠绿时证明她非常时髦...
  6. python3批量修改文件名称 代码说明
  7. linux系统怎么清理磁盘空间,LINUX系统怎么使用命令清理磁盘空间?
  8. centos7 hive mysql_CentOS7搭建Hive1.2.2+mysql5.7
  9. HashMap实现相同key,对value的操作
  10. 获取最大轮廓 opencv