三.    线程间的通信

1.    线程的几种状态

线程有四种状态,任何一个线程肯定处于这四种状态中的一种:

1)    产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。

2)    可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的start()方法后,线程就处于可执行状态,但显而易见的是此时线程不一定正在执行中。

3)    死亡(Dead):当一个线程正常结束,它便处于死亡状态。如一个线程的run()函数执行完毕后线程就进入死亡状态。

4)    停滞(Blocked):当一个线程处于停滞状态时,系统排程器就会忽略它,不对它进行排程。当处于停滞状态的线程重新回到可执行状态时,它有可能重新执行。如通过对一个线程调用wait()函数后,线程就进入停滞状态,只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态。

2.    class Thread下的常用函数函数

2.1    suspend()、resume()

1)    通过suspend()函数,可使线程进入停滞状态。通过suspend()使线程进入停滞状态后,除非收到resume()消息,否则该线程不会变回可执行状态。

2)    当调用suspend()函数后,线程不会释放它的“锁标志”。

2.2     sleep()

1)    sleep ()函数有一个参数,通过参数可使线程在指定的时间内进入停滞状态,当指定的时间过后,线程则自动进入可执行状态。

2)    当调用sleep ()函数后,线程不会释放它的“锁标志”。

2.3    yield()

1)    通过yield ()函数,可使线程进入可执行状态,排程器从可执行状态的线程中重新进行排程。所以调用了yield()的函数也有可能马上被执行。

2)    当调用yield ()函数后,线程不会释放它的“锁标志”。

2.4    sleep()和yield()的区别

1)    sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

2)    sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行

的机会。

2.5    join()

使调用join()的线程执行完毕后才能执行其它线程,在一定意义上,它可以实现同步的功能。

3. class Object下常用的线程函数

wait()、notify()和notifyAll()这三个函数由java.lang.Object类提供,用于协调多个线程对共享数据的存取。

3.1 wait()、notify()和notifyAll()

1) wait()函数有两种形式:第一种形式接受一个毫秒值,用于在指定时间长度内暂停线程,使线程进入停滞状态。第二种形式为不带参数,代表waite()在notify()或notifyAll()之前会持续停滞。

2) 当对一个对象执行notify()时,会从线程等待池中移走该任意一个线程,并把它放到锁标志等待池中;当对一个对象执行notifyAll()时,会从线程等待池中移走所有该对象的所有线程,并把它们放到锁标志等待池中。

3) 当调用wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。

3.2 wait()、notify()和synchronized

waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

4. wait()、notify()、notifyAll()和suspend()、resume()、sleep()的讨论

4.1 这两组函数的区别

1) wait()使当前线程进入停滞状态时,还会释放当前线程所占有的“锁标志”,从而使线程对象中的synchronized资源可被对象中别的线程使用;而suspend()和sleep()使当前线程进入停滞状态时不会释放当前线程所占有的“锁标志”。

2) 前一组函数必须在synchronized函数或synchronized block中调用,否则在运行时会产生错误;而后一组函数可以non-synchronized函数和synchronized block中调用。

4.2 这两组函数的取舍

Java2已不建议使用后一组函数。因为在调用wait()时不会释放当前线程所取得的“锁标志”,这样很容易造成“死锁”。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/293106/viewspace-582262/,如需转载,请注明出处,否则将追究法律责任。

java 线程的函数_Java线程总结相关推荐

  1. java怎样中断函数_Java中断一个线程操作示例

    本文实例讲述了Java中断一个线程操作.分享给大家供大家参考,具体如下: 一 点睛 中断一个线程,意味着该线程在完成任务之前,停止它正在进行的一切当前的操作. 有三个比较常用的函数: interrup ...

  2. java 同步转并行_Java线程与并行编程(二)

    你好,我是goldsunC 让我们一起进步吧! 线程的控制与同步 线程的状态与生命周期 '每个Java程序都有一个默认的主线程,想要实现多线程,必须在主线程中创建新的线程对象.新建的线程在它的一个完整 ...

  3. java方法生命周期_Java线程的第二种实现方式以及生命周期

    上篇中我们了解了Java线程的第一种实现方式,主要分两步,第一步是继承java.lang.Thread; 第二步是重写run()方法.接下来我们来看Java线程的第二种实现方式,也是分为两步,第一步, ...

  4. java 线程 状态 图_Java线程中的生命周期和状态控制图文详解

    这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...

  5. java 线程栈空间_java线程的内存不包含在JVM堆与栈中

    Java代码   publicclassMaxThreadsTest { publicstaticvoidmain(String[] args) { while(true) { newThread(n ...

  6. java new thread参数_java线程池01-ThreadPoolExecutor构造方法参数的使用规则

    为了更好的使用多线程,JDK提供了线程池供开发人员使用,目的在于减少线程的创建和销毁次数,以此达到线程的重复利用. 其中ThreadPoolExecutor是线程池中最核心的一个类,我们先简单看一下这 ...

  7. java io密集型任务_Java线程池讲解——针对IO密集型任务

    sap java开发技术详解&mdash基础 94.01元 (需用券) 去购买 > 针对 IO 密集型的任务,我们可以针对原本的线程池做一些改造,从而可以提高任务的处理效率. 基本 在阿 ...

  8. java线程不执行_java线程池,阿里为什么不允许使用Executors?

    带着问题 阿里Java代码规范为什么不允许使用Executors快速创建线程池? 下面的代码输出是什么? ThreadPoolExecutor executor = new ThreadPoolExe ...

  9. java 线程组作用_Java线程组(ThreadGroup)使用

    JDK 对线程组类注释: A thread group represents a set of threads. In addition, a thread group can also includ ...

最新文章

  1. Squid正向代理矩阵
  2. 2022年美国大学生数学建模竞赛常见问题汇总
  3. 一文说通Dotnet的委托
  4. Java默认值规则——各种数据类型的初试值是什么?
  5. 11-Elasticsearch的X-Pack
  6. 网页连接数据库 服务器,关于asp网页连接远程服务器上数据库问题
  7. 盘点语音识别技术在人工智能中的应用
  8. 【微软2014实习生及秋令营技术类职位在线測试】题目1 : String reorder
  9. vue点击后html放大,vue实现点击图片放大效果
  10. 50 道网络面试题及答案
  11. 开源数值计算软件OCTAVE 、SCILAB、R、Matlab简介
  12. Unity UI拉伸缩放适配屏幕尺寸
  13. 文件流方式导出Excel表格
  14. STC8单片机ADC采样注意事项
  15. 基于JSP的汽车租赁管理系统的设计与实现
  16. SVM-支持向量机理解(拉格朗日乘子法(Lagrange multiplier))
  17. 低代码对比分析,从工程化上看产品的优劣
  18. 原创小说 - 范特西学院(第一部上)
  19. adb unlock
  20. curses函数说明

热门文章

  1. 2020年人工神经网络第二次作业-参考答案第五题
  2. 尊重对手就是对自己最好的尊重
  3. 基于STM32F103RE ADDA板制作
  4. windows部署微服务jar包 yml_杰克布开源项目,低代码开发框架,Docker快速部署
  5. 为什么mysql打开闪屏_mysql登录闪屏问题解决办法
  6. MySQL界面说明_mysql 界面
  7. xx是一个类型 这在给定的上下文_基于上下文的派发:挂起临时变量内存
  8. 修改value_Java 反射修改String引发的思考?
  9. java if 没有_java – 如何做一个决定没有if语句
  10. Python 代码尝试