黑马程序员技术交流社区
标题:
java多线程总结
[打印本页]
作者:
viliv715
时间:
2014-8-25 17:42
标题:
java多线程总结
本帖最后由 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方法,进而结束线程。
*/
复制代码
作者:
轩辕苍穹
时间:
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