黑马程序员技术交流社区
标题:
多线程总结
[打印本页]
作者:
段郎
时间:
2014-4-18 12:08
标题:
多线程总结
毕向东java视频总结----线程
线程的状态
:
1、创建
2、运行
3、阻塞
4、冻结:执行了sleep或者wait方法以后,当被唤醒后进入阻塞状态
5、消亡:run执行完毕或者执行了stop方法
创建线程的两种方式
:
第一种是继承Thread类,在run()方法里面写要执行的内容。
第二种是实现Runnable
步骤:1、实现Runnable接口,复写run方法;
2、创建Thread对象并把Runnable子类对象传给Thread类的构造方法
3、运行Thread的start方法,此时执行的run其实是Runnable里面的run方法
两种创建线程的区别:
1、
实现方式避免单继承的局限性
2、Runnable子类的run方法中的内容独立共享,不会因为thread有多个就会增多(卖票的例子)
线程安全
造成线程不安全的原因:多个线程共享数据时,一个线程只执行了一部分语句,没有执行完,另一个线程就进来执行了,导致
共享数据
错误
解决方案:把共享资源设置成临界资源,也就是该资源每次只能被一个线程操作,只有操作完后才能别另一个线程操作。synchronized(对象){
需要同步的代码
},synchronized有一个
标志位
,当有一个线程操作synchronized 需要同步的代码时别的线程无法对这部分代码进行操作。
被synchronized(obj)修饰的代码块叫
同步代码块
,被synchronized修饰的函数叫
同步函数
同步的弊端:消耗资源,每次线程都要判断锁。
同步的有点:安全
小知识
:
1、创建一个线程对象(new DemoThread())就已经创建了一个线程,start()只是启动线程而已。
2、只要子线程为销毁,父进程就在
3、直接调用run()方法和start()方法区别大了去了,前者相当于普通对象调用方法,和线程没半毛钱关系了
4、线程都是有名字的,通过getName()得到,也可以通过setName()设置名称
5、获取当前运行进程的名称currentThread()
6、同步函数有所属对象的话,用到的锁就是这个对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2