黑马程序员——多线程

来源:互联网 发布:转换别人的淘宝客链接 编辑:程序博客网 时间:2024/06/05 20:12

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

概念

线程是程序执行一条路径,一个进程中可以包含多条线程
多线程并发执行可以提高程序的效率,可以同时完成多项工作

多线程并行和并发的区别
并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU)
并发是指两个任务都请求运行,而处理器只能接受一个任务,就把这两个任务安排轮流进行,由于    时间间隔较短,使人感觉两个任务都在进行


多线程中继承Thread类与实现Runnable接口的区别

 a.查看源码的区别:
          继承Thread:由于子类重写了Thread类的run()方法,当调用start()时,直接找子类的run()方法
          实现Runnable:构造中传入了Runnable的引用,成员变量记住了它,start()调用run()方法时内部判断成员变量Runnable的引用是否为空,不为空编译时看的是Runnable的run(),运行时执行的是子类run()方法

      b.好处与弊端之间的区别:
          1.Thread:
             好处是:可以直接使用Thread类中的方法,代码简单
             弊端是:如果已经有了父类,就不能用这种方法 
          2.Runnable:
             好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现 的,
             弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂


同步

     同步代码块
         使用synchronized(Object o)方法实现线程之间的同步,锁机制
         锁对象可以是任意的,但是不能为匿名对象,因为匿名对象不是同一对象
    
同步方法
         在方法返回值类型前加入synchronized
             非静态的同步方法的锁对象为this
             静态的同步方法的锁对象为该类的字节码对象,类名.class
     
死锁
         一般情况下不使用同步代码块嵌套,会出现死锁现象


多线程通信

 如果我们希望多个线程有规律的执行,就可以使用通信
通过使用wait()与notify()方法来实现

class Demo {MyThread t = new MyThread();//创建继承Thread类对象MyRunnable r = new MyRunnable();//创建实现runnable接口的类对象t.start();//启动线程for(int i = 0; i < 2000; i++) {System.out.println("bbbbb");}new Thread(r, "线程1").start();//创建Thread的匿名类对象并启动线程new Thread(r, "线程2").start();}//继承Thread类实现多线程class MyThread extends Thread {public void run() {for(int i = 0; i < 2000; i++) {System.out.println("aaaaaaaaaa");}}}//实现Runnable接口实现多线程class MyRunnable implements Runnable {public void run() {for(int i = 0; i < 2000; i++) {System.out.println("aaaaaaaaaa");}}}


0 0