毕向东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、同步函数有所属对象的话,用到的锁就是这个对象
|
|