黑马程序员技术交流社区

标题: 多线程学习笔记 [打印本页]

作者: 张益达    时间: 2014-6-18 10:30
标题: 多线程学习笔记
        首先 创建线程的方式有两种:实现Runnable接口,或者继承Thread类
继承方式:
        1、继承Thread类步骤    重写父类中的Run方法   
        2、建立子类对象的同时线程也将被创建
        3、通过调用start方法开启线程
实现方式:
                1        定义类实现Runnable接口
                2        覆盖Runnable接口中的run方法
                        run方法用于存放该线程要运行的代码
                3        通过Thread类建立线程对象
                4        将Runnable接口中的子类对象作为实际参数传入给Thread类的构造函数
                        为什么要将Runnable接口中的子类对象传入呢 ?
                        因为自定义的run方法是属于Runnable接口中的子类对象,所以要让线程执行制定对象的run方法就必须明确该run方法所属的对象
                5        调用Thread类的start方法开启线程  并调用Runnable接口里的Run方法


实现方式和继承方式的区别
        实现方式的好处  :避免的单继承的局限性。
        在定义线程实,建议使用实现方式
两种方式的区别:
        继承Thread:线程代码存放在Thread子类的run方法中
        实现Runnable:线程代码存放在接口的子类的run方法中
线程的生命周期:
        被创建       
        运行       
        冻结        当一个线程被sleep或者wait方法调用   放弃了执行资格  
        阻塞        具备执行资格,但是没有执行权       
        销毁        线程代码运行结束后
线程的安全问题
        原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分还没有执行完,另一个线程参与进来。导致了共享数据的错误
        解决方法:对多条操作共享数据的语句,只能让一个线程执行完在执行过程中,其他线程不可以参与执行
        JAVA对于多线程的安全问题提供了专业的解决方式。有两种表现形式
        1同步代码块
                synchronized(对象){
                        需要被同步的代码
                }
                对象如同锁,持有锁的线程可以再同步中执行,没有持有锁的线程即使获取了CPU执行权也进不去。因为没有锁
同步的前提

        1必须同时拥有两个或者以上的线程

        2必须使用同一个锁

必须保证同步中只能有一个线程在运行。

        好处:解决了多线程的安全问题

        弊端:多个线程都需要判断锁,较为消耗资源

2同步函数

        函数需要被对象调用。那么函数都有一个所属对象的引用。就是this。

        所以同步函数使用的锁是this。

        如果同步函数被静态修饰后,使用的锁不是this.因为静态方法中也不可以定义this。

        静态进内存时,内存中没有本类对象。但是一定有该类的字节码文件对象。类名.class

        该对象的类型是Class

静态的同步方法,使用的锁是该方法所在的类的字节码文件对象。 类名.class

死锁

        同步中嵌套同步将有可能会发生死锁 程序中要避免死锁

线程间通信

        其实就是多个线程在操作同一个资源,但是操作的动作不同

等待唤醒机制

        wait();

        notify();

        notifyAll();
        这样的方法都使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中因为只有同步在具有锁。
为什么这些操作线程的方法要定义在Object类中呢。因为 这些方法在操作同步中线程时,都必须要表示他们所操作的线程的持有的锁,只有同一个锁上的被等待线程可以同一个锁上的nitify唤醒。
        不可以对不同的锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。
        而锁可以是任意对象,所以可以被任意对象调用的方法被定义在Object中。
        JDK1.5中提供了多线程升级解决方法 将synchronized替换成显示的Lock操作

        将Object中的wait,,notfiy,notifyAll替换了Condedition对象

        该对象可以Lock锁获取进行获取。

线程销毁

        stop方法已经过时

                如何停止线程?

                只有一种方式,run方法结束

                开启多线程程序运行代码通常是循环结构只要控制住循环就可以让run方法结束,从而让线程结束

特殊情况:

        当线程处于冻结状态,就不会读取到标记。那么线程就不会结束。

当没有指定的方式让冻结的线程恢复到运行状态时,这时就需要对冻结状态进行清除,强制让线程恢复到运行中来。这样就可以操作标记让线程结束。Thread类中提供了该方法  interrupt方法

守护线程:有setDeamon方法  如果前台线程停止 则守护线程也停止

Join方法  

        当A线程执行到了B线程的join方法时,那么A线程就会等待B线程都执行完A才会执行

        join可以用来零时加入线程执行

线程优先级

        使用setPriority方法设置优先级,默认优先级是5   1、5、10是最明显的优先级所以起名为max——Priority,min——Priority,Norm——Priority。

yieId方法:暂停当前正在执行的线程对象,并执行其他线程

作者: 18353666072    时间: 2014-6-18 10:44
不错赞一个
作者: axuan    时间: 2014-6-18 11:24
赞一个哦
作者: pengyu    时间: 2014-6-18 11:43
不错,学习一下
作者: Great_Man    时间: 2014-6-18 12:09
其实,阻塞不是这么简单的一句话,要处理好,需要技术。比如线程中有TCP网络通信,阻塞进行,这时网络中断……
作者: qincai    时间: 2014-6-18 23:50
收藏来看看···
作者: 江峰渔火    时间: 2014-6-19 07:09
很详细啊




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