黑马程序员技术交流社区

标题: java多线程总结 [打印本页]

作者: viliv715    时间: 2014-8-25 17:42
标题: java多线程总结
本帖最后由 viliv715 于 2014-8-26 18:02 编辑
  1. /*
  2. 进程:是一个正在执行当中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
  3. 线程:就是进程中一个独立的控制单元,控制着进程的进行。一个进程中至少有一个线程。
  4. JVM启动的时候会有一个进程java.exe。该进程中至少一个线程负责java程序的运行,而且合格线程运行的代码存于main方法中,该线程称之为主线程,jvm启动不止一个线程还有负责垃圾回收机制的线程存在。
  5. ----------------------------------------------------------
  6. 创建线程的方式:
  7.         第一种方式:继承Thread类
  8.                 a定义类继承Thread。
  9.                 b复写Thread类中的run方法,将自定义的方法存储在run中。
  10.                 c调用线程的start方法(调用run方法)。

  11.         第二种方式:实现Runable接口
  12.                 a定义类实现Runable接口。
  13.                 b复写Runable接口中的run方法,将自定义的方法存储在run中。
  14.                 c将Runable接口的子类对象作为实际参数传递给Thread类的构造函数。
  15.                 d调用thread类的start方法开启线程并调用Runable接口子类的run方法。

  16. 为什么覆盖run方法?
  17.         Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。
  18. 为什么将Runable接口的子类对象作为实际参数传递给Thread类的构造函数?
  19.         自定义的run方法所属的对象是runable接口的子类对象,所以要让线程去指定特定对象的run方法
  20.         就必须明确该run方法所属对象。
  21. 两种创建线程方式的区别?
  22.         实现方法可以避免单继承的局限性,在定义线程时,建议使用实现方式。
  23.         继承:线程代码存放在Thread子类的run方法中。
  24.         实现:线程代码存放在接口Runable子类的run方法中。
  25. ----------------------------------------------------------
  26. 线程的运行状态:
  27.         创建:通过New关键字创建了Thread类(或其子类)的对象
  28.         运行:这种情况指的是Thread类的对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于阻塞状态时并没有运行完自己的run方法,时间片用完之后回到运行状态。
  29.         阻塞:这时的线程指的是获得CPU的运行资格,因为cpu时间片轮训等问题没有获得执行权。
  30.         消亡:处于运行状态的线程,在执行完run方法之后,就变成了消亡状态了。
  31.         冻结:这种状态指的是处于运行状态的线程,出于某种原因,比如调用了sleep、wait方法、等待用户输入等而让出当前的CPU给其他的线程,失去运行资格,唤醒时先进入阻塞状态。
  32. ----------------------------------------------------------
  33. 多线程的安全性:
  34.         当多条语句在操作同一个线程的共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来,导致共享数据错误。
  35.         针对这一特点,我们能想到的解决方法是,对于多条操作共享数据的语句,只能让一个线程都执行完,在此期间,其他线程不可参与。
  36.         java中提供的专业技术叫做同步代码块、同步函数、lock和condition接口。
  37. 同步代码块(过时,不推荐):
  38.         synchronized(对象)//对象就如同锁,持有锁的线程可以执行代码,没有锁的线程就算有执行权也因为没有获取锁而无法执行代码。
  39.         {需要被同步的代码}
  40. 同步函数(过时,不推荐):在定义函数的时候加上synchronized关键字。非静态同步函数使用的锁是this。静态同步函数使用的锁是该方法所在类的字节码文件对象class。
  41. 推荐方法:JDK1.5中奖同步synchronized替换成了lock接口,将object中的wait、notify、notifyAll替换成了condition对象。condition对象可以从lock中获取。
  42. 同步的前提:
  43.         a必须要有两个或者两个以上的线程。
  44.         b必须是多个线程使用同一个锁。
  45. 同步的优缺点:
  46.         好处:解决了多线程的安全问题。
  47.         弊端:多个线程都需要判断锁,较为消耗资源。
  48. 使用同步代码块原则:
  49.         a明确哪些代码是多线程运行代码
  50.         b明确共享数据
  51.         c明确多线程运行代码中安歇语句是操作共享数据的。
  52. ----------------------------------------------------------
  53. 线程间的通信:多个线程操作同一个资源,但是操作的动作不同。
  54. 停止线程:stop方法因存在安全隐患,已经停用。想要停止线程,就必须使run方法结束。通过控制循环来结束run方法,进而结束线程。
  55. */
复制代码

作者: 轩辕苍穹    时间: 2014-8-25 18:07
楼主威武!
作者: 一顿一只牛    时间: 2014-8-25 22:10
德玛西亚万岁
作者: 碎流    时间: 2014-8-26 11:47
好人万岁..        
作者: ximi    时间: 2014-8-26 20:24
总结的不错
作者: lfsfxyzljhm    时间: 2014-8-26 20:38
写的很具体,我感觉多线程的很多不是很常用,将基本的记住就OK了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2