本帖最后由 viliv715 于 2014-8-26 18:02 编辑
- /*
- 进程:是一个正在执行当中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
- 线程:就是进程中一个独立的控制单元,控制着进程的进行。一个进程中至少有一个线程。
- JVM启动的时候会有一个进程java.exe。该进程中至少一个线程负责java程序的运行,而且合格线程运行的代码存于main方法中,该线程称之为主线程,jvm启动不止一个线程还有负责垃圾回收机制的线程存在。
- ----------------------------------------------------------
- 创建线程的方式:
- 第一种方式:继承Thread类
- a定义类继承Thread。
- b复写Thread类中的run方法,将自定义的方法存储在run中。
- c调用线程的start方法(调用run方法)。
- 第二种方式:实现Runable接口
- a定义类实现Runable接口。
- b复写Runable接口中的run方法,将自定义的方法存储在run中。
- c将Runable接口的子类对象作为实际参数传递给Thread类的构造函数。
- d调用thread类的start方法开启线程并调用Runable接口子类的run方法。
- 为什么覆盖run方法?
- Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。
- 为什么将Runable接口的子类对象作为实际参数传递给Thread类的构造函数?
- 自定义的run方法所属的对象是runable接口的子类对象,所以要让线程去指定特定对象的run方法
- 就必须明确该run方法所属对象。
- 两种创建线程方式的区别?
- 实现方法可以避免单继承的局限性,在定义线程时,建议使用实现方式。
- 继承:线程代码存放在Thread子类的run方法中。
- 实现:线程代码存放在接口Runable子类的run方法中。
- ----------------------------------------------------------
- 线程的运行状态:
- 创建:通过New关键字创建了Thread类(或其子类)的对象
- 运行:这种情况指的是Thread类的对象调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于阻塞状态时并没有运行完自己的run方法,时间片用完之后回到运行状态。
- 阻塞:这时的线程指的是获得CPU的运行资格,因为cpu时间片轮训等问题没有获得执行权。
- 消亡:处于运行状态的线程,在执行完run方法之后,就变成了消亡状态了。
- 冻结:这种状态指的是处于运行状态的线程,出于某种原因,比如调用了sleep、wait方法、等待用户输入等而让出当前的CPU给其他的线程,失去运行资格,唤醒时先进入阻塞状态。
- ----------------------------------------------------------
- 多线程的安全性:
- 当多条语句在操作同一个线程的共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来,导致共享数据错误。
- 针对这一特点,我们能想到的解决方法是,对于多条操作共享数据的语句,只能让一个线程都执行完,在此期间,其他线程不可参与。
- java中提供的专业技术叫做同步代码块、同步函数、lock和condition接口。
- 同步代码块(过时,不推荐):
- synchronized(对象)//对象就如同锁,持有锁的线程可以执行代码,没有锁的线程就算有执行权也因为没有获取锁而无法执行代码。
- {需要被同步的代码}
- 同步函数(过时,不推荐):在定义函数的时候加上synchronized关键字。非静态同步函数使用的锁是this。静态同步函数使用的锁是该方法所在类的字节码文件对象class。
- 推荐方法:JDK1.5中奖同步synchronized替换成了lock接口,将object中的wait、notify、notifyAll替换成了condition对象。condition对象可以从lock中获取。
- 同步的前提:
- a必须要有两个或者两个以上的线程。
- b必须是多个线程使用同一个锁。
- 同步的优缺点:
- 好处:解决了多线程的安全问题。
- 弊端:多个线程都需要判断锁,较为消耗资源。
- 使用同步代码块原则:
- a明确哪些代码是多线程运行代码
- b明确共享数据
- c明确多线程运行代码中安歇语句是操作共享数据的。
- ----------------------------------------------------------
- 线程间的通信:多个线程操作同一个资源,但是操作的动作不同。
- 停止线程:stop方法因存在安全隐患,已经停用。想要停止线程,就必须使run方法结束。通过控制循环来结束run方法,进而结束线程。
- */
复制代码 |
|