黑马程序员_基础学习笔记(8)

来源:互联网 发布:linux环境变量格式 编辑:程序博客网 时间:2024/06/05 17:38

---------------------- android培训、java培训、期待与您交流! ----------------------  

黑马程序员---比向东---第十一天

 

多线程:

       进程:是一个正在执行中的程序。

               每一个进程执行都有一个执行顺序,该顺序是一个执行路径,

               或者叫一个控制单元。

       线程:就是进程中的一个独立的控制单元。

               线程在控制着进程的执行。

       一个进程中至少有一个线程。

       start()方法的作用:1,启动线程 2,调用run()方法

       多线程特点:随机性,谁抢到谁执行,至于执行多长时间由cpu说了算。

              原因是多个线程都获取cpu的执行权,cpu执行到谁,谁就运行。

              注:在某一个时刻,只能有一个程序在运行(多核除外)

              可以理解为多线程的运行行为时在互相抢夺cpu的执行权。

    为什么要覆盖run方法?

              THread类用于描述线程。该类就定义了一个功能,用于存储线程

              的运行代码,该存储功能就是run方法。也就是说thread类中的

              run方法是用于存储线程要运行的代码。所以复写run方法就是将

              自定义的代码存储在run方法中,让线程运行。


       Runnable接口

         1,定义类实现Runnable接口

         2,覆盖Runnable接口中的run方法

                     将线程要运行的代码存放在run方法中。

         3,通过Thread类建立线程对象。

         4,将Runnable接口的子类对象作为实际参数传递给Ttread类的构造函数

                     为什么要将Runnable接口的子类对象传递给thread的构造函数?

                     因为,自定义的run方法所属的对象是Runnable接口的子类对象,

                     所以要让线程去指定指定对象的run方法,就必须明确该run方法所属的对象。

                     而thread类的构造方法之一是  Thread(Runnable r){}

         5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法

       实现方式和继承方式的区别

              实现方式的好处:避免了单继承的局限性。推荐使用实现方式。

              继承方式线程代码存放在Thread子类run方法中,而实现方法存放在

                              就扣的子类run方法中。

       多线程的安全问题

              问题原因

              当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了

              一部分。还没有执行完,另一个线程参与进来执行,导致了共享数据的错误

              解决办法

       对多条操作共享数据的的语句,只能让一个线程都执行完,在执行过程中

       其他线程不可以参与执行。

 

       java对于多线程的安全问题提供了专业的解决方式

       就是同步代码块

       synchronized(对象)

       {

              需要被同步的代码

       }对象如同锁,持有锁的线程可以在同步中执行。没有持有锁的线程

        即使获取cpu的执行权,也进不去,因为没有获取锁。

      

       同步的前提

        1 必须要有两个或者两个以上的线程

        2 必须是多个线程使用同一个锁

        3 必须保证同步代码中只有一个线程在执行

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

       弊端:耗费内存资源,每次进锁都要判断!也耗费时间

       如何判断多线程程序中有安全问题的代码?

        1 明确哪些代码是多线程运行代码

        2 明确共享数据

        3 明确多线程运行代码中哪些操语句是操作共享数据的。

        多线程死锁参考 13 14 15讲

黑马程序员---比向东---第十二天

线程通信

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

       等待唤醒机制:两个或多个线程操作同一共享数据。

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

              wait() 释放资源,释放锁。

              sleep() 释放资源,不释放锁。

              notify() 唤醒最先wait的线程。

              notifyAll()唤醒所有wait的线程。

              都是用在同步中,因为要对持有监视器(锁)的线程操作

              所以要使用在同步中,因为只有同步才具有锁。

              为什么这些操作线程的方法要定义在object类中呢?

              因为这些方法在操作同步线程时,都必须要标示它们所操作线程持有的锁

              只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒

              不可以对不同锁中的线程唤醒。

              也就是说,等待和唤醒必须是同一个锁。

              而锁可以是任意对象,锁可以被任意对象调用的方法定义在object类中

               参考代码  InputOutputDemo12_3     ProducerConsumerDemo12_5

       join:

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

              a才会执行。join可以用来临时加入线程执行。

        优先级

所有线程默认优先级都是5   1<=优先级<=10 MIN_PRIORTY  MORM_PRIORTYMAX_PRIORTY

              setPriority(int);设置优先级

             

stop方法已经过时

       所以停止线程只有一种,run方法结束。

       开启多线程运行,运行代码通常是循环结构。

       只要控制住循环,就可以让run方法结束,即线程结束

 

       特殊情况

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

      

 

       当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。

       强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束

       Thread类提供方法 interrupt();


点击打开链接 点击打开链接 点击打开链接 点击打开链接 点击打开链接 <a href="target=" _xhe_href="target=" blank"="">java培训、期待与您交流!">点击打开链接 点击打开链接 点击打开链接 点击打开链接 <a href="target=" _xhe_href="target=" blank"="">http://edu.csdn.net/heima">点击打开链接


原创粉丝点击