黑马程序员_java多线程<四>

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


多线程:

1、进程和线程:

     进程:正在进行的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

     线程:进程内部的一条执行路径或者一个控制单元。

     区别:一个进程至少有一个线程, 进程在执行过程中拥有独立的内存单元,而多个线程共享内存;  

    优势:解决了多部分同时运行的问题,提高效率

    弊端:线程太多会导致效率的降低,因为线程的执行依靠的是CPU的来回切换。

2、实现多线程的方法:继承Thread类和实现Runnable接口。

    继承Thread:

定义一个类继承Thread类;

复写run()方法,将线程的任务代码封装到run方法中;

直接创建Thread的子类对象;

创建线程,调用start()方法;

 //可以通过Thread的getName()获取线程名。

    实现Runnable接口

定义一个类,实现Runnable接口;

 覆盖run()方法,将代码封装到run方法;

创建Runnable接口的子类对象

        将Runnabl接口的子类对象作为参数传递给Thread类的构造函数;

创建Thread类对象;

        调用start()方法,启动线程。

  

    两种方法区别:

        a,实现Runnable接口避免了单继承的局限性;

        b,继承Thread类线程代码存放在Thread子类的run方法中, 实现Runnable接口线程代码存放在接口的子类的run方法中;

        c,在定义线程时,建议使用实现Runnable接口,因为几乎所有多线程都可以使用这种方式实现。

3、创建线程复写run方法

    Thread类用于描述线程。Thread类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。

4start()run方法的区别

    调用start方法方可启动线程,而run方法只是thread的一个普通方法,调用run方法不能实现多线程;

    Start()方法:

        start方法用来启动线程,实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的

        代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,

        一旦得到cpu时间片(执行权),就开始执行run()方法,这里方法run()称为线程体,

        它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。   

    Run()方法:

        run()方法只是Thread类的一个普通方法,如果直接调用Run方法,程序中依然只有主线程这一个线程,

        其程序执行路径还是只有一条,还是要等待run方法体执行完毕后才可继续执行下面的代码,

        这样就没有达到多线程的目的。

5、线程的几种状态:

    新建:new一个Thread对象或者其子类对象就是创建一个线程,当一个线程对象被创建,但是没有开启,这个时候,

         只是对象线程对象开辟了内存空间和初始化数据。         

    就绪:新建的对象调用start方法,就开启了线程,线程就到了就绪状态。

         在这个状态的线程对象,具有执行资格,没有执行权。

    运行:当线程对象获取到了CPU的资源。

          在这个状态的线程对象,既有执行资格,也有执行权。

    冻结:运行过程中的线程由于某些原因(比如wait,sleep),释放了执行资格和执行权。

             当然,他们可以回到运行状态。只不过,不是直接回到。

         而是先回到就绪状态。

    死亡:当线程对象调用的run方法结束,或者直接调用stop方法,就让线程对象死亡,在内存中变成了垃圾。            

6sleep()wait()的区别:

     (1)这两个方法来自不同的类,sleep()来自Thread类,和wait()来自Object类。

     (2)sleepThread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了bsleep方法,实际上还是a去睡觉,

        要让b线程睡觉要在b的代码中调用sleep。而wait()Object类的非静态方法。

     (3)sleep()释放资源不释放锁,而wait()释放资源释放锁;

     (4)使用范围:wait,notifynotifyAll只能在同步控制方法或者同步控制块里面使用,sleep可以在任何地方使用

7、多线程:当程序的多条语句在操作线程共享数据时,执行了一部分还没执行完,另一个线程抢夺到cpu执行权执行,此时就导致共享数据发生错误。可以对多条操作共享数据的语句进行同步。

8、同步的两种表现形式:

    同步代码块格式:

        synchronized(对象)

        {

           需同步的代码;

        }

    同步函数格式:

        修饰词synchronized返回值类型 函数名(参数列表)

        {

           需同步的代码;

        }

 jdk1.5后,用lock锁取代了synchronized

9、死锁

    两个线程对两个同步对象具有循环依赖时,就会发生死锁。即同步嵌套同步,而锁却不同。

10wait()sleep()notify()notifyAll()

    wait():使一个线程处于等待状态,并且释放所持有的对象的lock

    sleep():使一个正在运行的线程处于睡眠状态,是静态方法。

    notify():唤醒一个处于等待状态的线程。

    Allnotity():唤醒所有处入等待状态的线程。

11LockCondition

    将同步synchonized替换成了显示的Lock操作,将Object中的waitnotifynotifyAll替换成了Condition对象。

    该对象可以Lock锁进行获取

    Lock的方法:

        void lock() ;获取锁。

        Condition newCondition();返回绑定到此 Lock实例的新 Condition实例。

        void unlock();释放锁。

    Condition方法:

        void await();造成当前线程在接到信号或被中断之前一直处于等待状态。

        void signal();唤醒一个等待线程。         

        void signalAll();唤醒所有等待线程。

12、停止线程:    

        当线程属于冻结状态,就不会读取循环控制标记,则线程就不会结束。引入Thread类中的Interrupt方法结束线程的冻结状态,强制让线程恢复到运行状态.

13interrupt:

    void  interrupt()中断线程:中断状态将被清除,它还将收到一个 InterruptedException

14、守护线程(后台线程):set  Daemon(boolean on);将该线程标记为守护线程或者用户线程。 当正在运行的线程都是守护线程时,java虚拟机jvm退出;所以该方法必须在启动线程前调用;

    特点: 守护线程开启后和前台线程共同抢夺cpu的执行权,开启、运行两者都没区别,但结束时有区别,当所有前台线程都结束后,守护线程会自动结束。       

15、多线程join方法:

    void join();等待该线程终止。

    void join(long millis) ;等待该线程终止的时间最长为 millis毫秒。

    A线程执行到B线程的join方法时,A就会等待B线程都执行完,A才会执行;join可以用来临时加入线程执行;

16、多线程优先级:yield()方法

    yield();暂停当前正在执行的线程对象,并执行其他线程

    set  Priority(intnewPriority);更改线程优先级

    int  getPriority();返回线程的优先级。

    String  toString();返回该线程的字符串表示形式,包括线程名称、优先级和线程组

    MAX_PRIORITY;最高优先级(10)

    Min_PRIORITY;最低优先级(1)

    Morm_PRIORITY;默认优先级(5级)


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值