黑马程序员 多线程(一)

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

 

1:多线程(重点)
  (1)多线程
  A:进程:正在运行的程序,代表的是应用程序在内存中的执行区域。
  B:线程:线程是进行的执行单元,执行路径。
  C:任何一个应用程序,都至少有一条执行路径。
  D:单线程程序:应用程序只有一条执行路径。
  E:多线程程序:应用程序有多条执行路径。
  
 (2)jvm启动的时候,是单线程的还是多线程的?
  是多线程的。
  假如jvm的启动时单线程的,那么,在程序的运行过程中,就可能存在着
  内存溢出的隐患。不可能等到内存溢出了,在去进行垃圾回收。所以,jvm
  启动是多线程的。至少有两个,主线程和垃圾回收线程。


 (3)java中实现多线程的方式
  A:继承Thread类
  步骤:
  **自定义类继承Thread类
  **重写run方法
  **创建自定义类的对象
  **调用start方法
   
   代码体现:
   
   public class ThreadDemo extends Thread
   {
    public void run()
    {
     //code
    }
   }

   public class ThreadDemoTest
   {
    public static void main(String[] args)
    {
     ThreadDemo td1 = new ThreadDemo(); 
     ThreadDemo td2 = new ThreadDemo();

     td1.start();
     td2.start();
    }
   }

  B:实现Runnable接口
   步骤:
   **创建自定义类实现Runnable接口
   **在自定义类中实现Runnable接口中的run方法
   **创建自定义类对象,并把该对象作为参数传递给
     Thread类的构造方法来创建Thread的对象
   **调用start方法
   
   代码体现:

   public class RunnableDemo implements Runnable
   {
    public void run()
    {
     //code
    }
   }

   public class RunnableDemoTest
   {
    public static void main(String[] args)
    {
     RunnableDemo rd = new RunnableDemo();

     Thread t1 = new Thread(rd);
     Thread t2 = new Thread(rd);

     t1.start();
     t2.start();
    }
   }


 (4)Thread类中的常用的几个小方法
  A:String getName():获取线程的名称
  B:static Thread currentThread():获取当前线程的对象的引用
   用于不是Thread类的子类获取线程对象的名称。
   格式:Thread.currentThread().getName();
  C:void setName(String name):通过set方法设置线程对象的名称。
  D:Thread(String name):通过构造方法设置线程对象的名称。


 (5)线程的随机性原理
  CPU的特点:在同一时刻,只能有一个线程执行。
  所以,多个线程其实是在抢占CPU的资源。而CPU呢,却是在这些线程中做着高速的切换。


 (6)线程的生命周期和在生命周期中各个状态的特点
  新建:当一个线程对象被创建,但是没有开启,这个时候,只是对象线程对象开辟了
        内存空间和初始化数据。
  就绪:新建的对象调用start方法,就到了就绪状态。
        在这个状态的线程对象,具有执行资格,没有执行权。
  运行:当线程对象获取到了CPU的资源。
        在这个状态的线程对象,具有执行资格,也具有执行权。
  
        阻塞:运行过程中的线程由于某些原因(比如wait,sleep),释放了执行权和执行资格。
       当然,他们可以回到运行状态。只不过,不是直接回到。
       而是先回到就绪状态。
  死亡:当线程对象调用的run方法结束,或者直接调用stop方法,就让线程对象死亡,
        在内存中变成了垃圾。
  
2:线程同步(重点)
 (1)产生线程安全的原因
  A:多个线程访问出现延迟。
  B:线程访问的随机性

  注:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大的。


 (2)如果判断一个线程程序有没有安全问题呢?
  A:多个线程操作共享数据
  B:这个操作是分多条语句执行的。


 (3)解决线程安全问题的方式
  A:同步代码块
  B:格式:
   synchronized(对象)
   {
    //需要被同步的代码
   }


 (4)同步代码块问题:
  A:同步代码块的锁是任意同一对象。
  B:当你发现你把某个程序加了同步后,还没有解决线程安全问题。
    这个时候,你需要考虑你使用的是否是同一把锁(对象);


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值