`
lvhuiqing
  • 浏览: 246149 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

线程小结

 
阅读更多
<p><span style="font-size: x-small;"></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">1,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">线程的四种状态:</span><span lang="EN-US"><span style="font-family: Times New Roman;">new</span></span><span style="">,</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">,</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">,</span><span lang="EN-US"><span style="font-family: Times New Roman;">dead</span></span><span style="">。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">2,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">new</span></span></span><span style="font-size: small;"><span style="">状态:线程刚刚被创建,还没有调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">start</span></span><span style="">方法。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">3,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">runnable</span></span></span><span style="font-size: small;"><span style="">状态:线程调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">start</span></span><span style="">()方法以后。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style="font-size: small;"><span style="">注:处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态的线程不一定会被执行,要看操作系统会不会给分配时间片。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">4,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">blocked</span></span></span><span style=""><span style="font-size: small;">状态:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: small;"><span style="">处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态的线程在以下五种情况下会转入到</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态:</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">a,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">sleep</span></span></span><span style=""><span style="font-size: small;">()方法被调用</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">b,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">wait</span></span></span><span style=""><span style="font-size: small;">()方法被调用。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">c,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">等待</span><span lang="EN-US"><span style="font-family: Times New Roman;">io</span></span><span style="">结束</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">d,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">等待文件锁。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">e,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">suspend</span></span></span><span style=""><span style="font-size: small;">()方法被调用。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-size: small;"><span style="">处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态的线程会在以下情况下转入到</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">a,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">sleep</span></span></span><span style=""><span style="font-size: small;">()方法中的时间结束</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">b,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">被其他线程的</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">()或者</span><span lang="EN-US"><span style="font-family: Times New Roman;">notifyAll</span></span><span style="">方法唤醒。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">c,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">等待的文件锁得到</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">d,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Io</span></span></span><span style=""><span style="font-size: small;">结束</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">e,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">resume</span></span></span><span style=""><span style="font-size: small;">()方法被执行。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">5,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">终止状态</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">a,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">run</span></span></span><span style=""><span style="font-size: small;">方法执行结束。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">b,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">stop</span></span></span><span style=""><span style="font-size: small;">()方法被调用。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">6,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">无法区分处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态的线程是否正在运行。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style=""><span style="font-size: small;">无法区分一个线程是处于刚刚创建的状态还是死亡状态。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style="font-size: small;"><span style="">无法区分一个线程是处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">状态还是</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Times New Roman;">isAlive</span></span><span style="">()方法是判断是处于活动状态(</span><span lang="EN-US"><span style="font-family: Times New Roman;">runnable</span></span><span style="">和</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">的和)还是其它状态。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">7,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">resume</span></span></span><span style="font-size: small;"><span style="">()方法只有在</span><span lang="EN-US"><span style="font-family: Times New Roman;">suspend</span></span><span style="">方法被调用的时候才有效,不推荐。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">8,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">join</span></span></span><span style=""><span style="font-size: small;">()方法。让其他线程等待,直到本线程执行完毕。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">9,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">在</span><span lang="EN-US"><span style="font-family: Times New Roman;">run</span></span><span style="">方法中,不赞成直接使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">stop</span></span><span style="">方法在停止自身线程,这就意味着我们必须在</span><span lang="EN-US"><span style="font-family: Times New Roman;">run</span></span><span style="">方法中不断的进行判断,来决定自身是否应该被停止。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">10,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">在一个</span><span lang="EN-US"><span style="font-family: Times New Roman;">windows</span></span><span style="">系统中,线程可以不调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">sleep</span></span><span style="">方法,其它线程也可以获得时间片,但是如果换作其他线程就必须不时调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">sleep</span></span><span style="">或者</span><span lang="EN-US"><span style="font-family: Times New Roman;">yield</span></span><span style="">方法,以使其他线程获得时间片。尤其在网络变成过程中,由于不能确定自己程序所处的操作系统环境,就更要注意。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">11,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">等待进入同步方法的进程和调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">wait</span></span><span style="">方法的进程有着本质的区别:等待进入同步方法的进程一旦获得对象锁之后,会自动进入。但是调用</span><span lang="EN-US"><span style="font-family: Times New Roman;">wait</span></span><span style="">方法以后的进程会放弃自己所获得的锁对象,并会一直处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态,直到另外某个进程调用了</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">方法或者</span><span lang="EN-US"><span style="font-family: Times New Roman;">notifyAll</span></span><span style="">方法。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">12,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">notifyAll</span></span></span><span style="font-size: small;"><span style="">方法唤醒所有处于</span><span lang="EN-US"><span style="font-family: Times New Roman;">blocked</span></span><span style="">状态的线程,</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">方法随机唤醒一个。因此</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">方法是不安全的。可能会导致死锁。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">13,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">java</span></span></span><span style=""><span style="font-size: small;">语言并没有可以预防死锁的机制,因此在设计多线程程序时候,必须要保证每一个被阻塞的线程迟早会被通知。或者有一个线程会一直运行。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">14,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">使用</span><span lang="EN-US"><span style="font-family: Times New Roman;">stop</span></span><span style="">方法</span><span lang="EN-US"><span style="font-family: Times New Roman;">suspend</span></span><span style="">方法都是不明智的。</span><span lang="EN-US"><span style="font-family: Times New Roman;">stop</span></span><span style="">方法会强行关闭线程,因此是不安全的。</span><span lang="EN-US"><span style="font-family: Times New Roman;">Suspend</span></span><span style="">方法在把线程挂起的时候,不会释放改线程的对象锁,因此会导致死锁。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">15,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style="font-size: small;"><span style="">有一个可以把线程锁住,而且不会导致死锁的方法,教科书:</span><span lang="EN-US"><span style="font-family: Times New Roman;">38</span></span><span style="">页</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">16,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">setDaemon(),</span></span></span><span style=""><span style="font-size: small;">这是服务线程,把当前线程设置为服务线程,表明当前线程是为其他线程服务的,如果其他所有线程都停止了,那么本线程也就停止了。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">17,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">使用管道进行线程通讯的最重要理由是为了让线程变得简单。生产者只需要把生产的数据放入管道,消费者只需要从管道中获得数据,而不用考虑同步性</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-family: Times New Roman;"><span style="font-size: small;">18,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span></span><span style=""><span style="font-size: small;">当一个线程获取某个对象的一个同步方法的对象锁的时候,其它线程就无法访问该对象的所有同步方法。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">19,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Synchronaized</span></span></span><span style="font-size: small;"><span style="">用于类方法的时候,对象锁来自于</span><span lang="EN-US"><span style="font-family: Times New Roman;">this.class</span></span><span style="">实例。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">20,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Synchronaized</span></span></span><span style="font-size: small;"><span style="">用于对象方法的时候,对象锁来自于</span><span lang="EN-US"><span style="font-family: Times New Roman;">this</span></span><span style="">实例</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">21,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Sleep</span></span></span><span style="font-size: small;"><span style="">方法:不会释放对象锁,但是会把</span><span lang="EN-US"><span style="font-family: Times New Roman;">cpu</span></span><span style="">时间让给他人。线程具有的方法。</span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">22,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Wait</span></span></span><span style="font-size: small;"><span style="">方法,释放对象锁,直到</span><span lang="EN-US"><span style="font-family: Times New Roman;">notify</span></span><span style="">或者</span><span lang="EN-US"><span style="font-family: Times New Roman;">notifyall</span></span><span style="">被调用。对象具有的方法。在同步方法中被调用。因为</span><span lang="EN-US"><span style="font-family: Times New Roman;">wait</span></span><span style="">方法如果在没有获取对象锁的情况下被调用的话,会抛出</span><span lang="EN-US"><span style="font-family: Times New Roman;">IllegalmonitorStateException</span></span></span></p>
<p class="MsoNormal" style=""><span style="font-family: Times New Roman;"><span style="" lang="EN-US"><span style=""><span style="font-size: small;">23,</span><span style="font: 7pt 'Times New Roman';"> </span></span></span><span lang="EN-US"><span style="font-size: small;">Sleep</span></span></span><span style="font-size: small;"><span style="">是静态方法,因此最佳的调用方式是</span><span lang="EN-US"><span style="font-family: Times New Roman;">Thread.sleep()</span></span><span style="">;</span></span></p>
分享到:
评论

相关推荐

    多线程小结

    多线程小结

    Java多线程小结

    Java中多线程的学习的自我小结,有多线程的意思,多线程常见的控制方法等内容

    python进程与线程小结实例分析

    本文通过实例代码分析了python进程与线程知识小结,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧

    java线程基本知识小结.doc

    java线程基本知识小结.doc java线程基本知识小结.doc

    C++多线程编程入门小结.pdf

    C++多线程编程入门小结.pdf

    Visual Basic.NET线程参考手册

    3.5 端到端的示例 3.5.1 编写自己的线程安全包装器 3.5.2 数据库连接池 3.6 本章小结第4章 设计模式 4.1 应用程序中的多线程 4.2 STA线程模式 4.3 MTA线程模式 4.3.1 指定线程模式 4.3.2 设计线程应用程序 4.3.3 ...

    C++多线程编程入门小结

    一个c++开发技巧合集,也是大家多线程编程入门的总结。初学多线程编程的童鞋可以看看。

    Java线程类小结(附思维导图)

    NULL 博文链接:https://newjueqi.iteye.com/blog/400862

    java应用程序中使用线程

    锁定排序 3.6 线程优先级 3.7 监控程序线程 3.8 在应用程序中加入线程 ...线程中的过时方法 3.12 DownloadFiles类 3.13 未捕捉的异常 3.14 自愿放弃处理器 3.15 并发工具 3.16 小结

    Linux多线程编程小结

     Linux进程创建一个新线程时,线程将拥有自己的栈(由于线程有自己的局部变量),但与它的创建者共享全局变量、文件描写叙述符、信号句柄和当前文件夹状态。  Linux通过fork创建子进程与创建线程之间是有差别的...

    突破JAVA万人面试,懂多线程者得天下.zip

    目录网盘文件永久链接 01课程安排av 02什么是并发和并行av ...08线程创建小结av 09线程生命周期avi 10.线程安全问题什么是线程安全avi 11线程安全同题问题分析avi 12线程安全问题线程安全问题演示avi ...............

    java线程详解

    八、线程同步小结 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:volatile关键字 Java线程:新特征-线程池 一、固定大小的线程池 二、单任务线程池 三、可变尺寸的线程池 四、延迟连接池 五、...

    多线程完整(C#),综合概念与例子,详细讲述多线程的运用

    1.多线程的概念 2.操纵线程 3.线程的同步和通讯 4.线程池和定时器 5.互斥对象 6.小结

    JAVA多线程操作方法实用大全

    欧柏泰克教学小结:JAVA多线程操作方法实用大全

    window编程 新小结

    个人小结 有关MFC中的多线程 消息循环 网络编程

    5操作系统实验报告.doc

    课 程 实 验 报 告 课程名称: 线程控制实验 专业班级: 学 号: 姓 名: 报告日期: 2013年12月03日 计算机科学与技术学院 线程控制实验 一、目的和要求 通过本实验掌握在 Linux操作系统中遵循 Posix线程标准接口...

    Java线程安全问题小结_动力节点Java学院整理

    主要介绍了Java线程安全问题小结的相关资料,需要的朋友可以参考下

    c#中多线程访问winform控件的若干问题小结

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来解决这个问题,下面我将详细的介绍。 首先来看传统方法: 代码如下:public partial class Form1 ...

    分享40个Java多线程问题小结

    多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级,本文给大家分享40个Java多线程问题小结 的相关资料,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics