黑马程序员——线程

来源:互联网 发布:日式豚骨叉烧拉面 淘宝 编辑:程序博客网 时间:2024/06/05 18:50

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

6.1. 概述

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

       线程:是进程中一个独立的控制单元,线程控制进程的执行,一个进程至少有一个执行的线程

       JVM:java虚拟机就是一个多线程的机制,主线程运行,垃圾回收机制也在同时运行

       Thread类:extends Object implements Runnable,线程类继承Thread

       Runnable接口:里面有一个run方法,线程类实现Runnable接口

6.2. 线程的运行状态

创建-->运行:调用start方法

运行-->冻结:调用sleep方法

冻结-->运行sleep时间到了,自动释放

运行-->冻结:调用wait方法

冻结-->运行:调用notify方法

运行-->消亡:调用stop方法或者run方法结束

冻结-->消亡:调用stop方法

6.3. 线程的实现

       1.继承Thread类

复写run方法

生成的对象调用start方法,通过start方法调用Thread内部的run方法

       2.实现Runnable接口

              步骤:

                     定义类,实现Runnable接口

                     覆盖接口中run方法

                     通过Thread类建立对象

                     将Runnable子类对象传给Thread对象

                     用Thread类的start()方法运行线程

6.4. 线程安全问题

多条数据同时操作统一线程的共享数据,另一线程参与进来,导致数据错误,如何解决?

利用想成同步机制。

       同步代码块:两个或两个以上线程,并且线程用的是统一对象锁

                            弊端是每次都要判断锁,比较耗费资源

                     synchronized(对象){

                  //同步内容

           }

       同步函数:将synchronized直接写在函数上,与代码块的功能相同

                     public synchronized 返回值 函数名(){}//此时同步对象是:类名.class

6.5. 多线程死锁

       死锁:线程之间相互调用相互等待

       如何解决死锁相关问题?

       利用等待唤醒机制,增加标志位进行对锁的控制,利用Object类中的方法wait和notify进行控制。Notify:唤醒的是第一个等待的线程。

       为什么将wait和notify定义在Object中?

       因为在操作同步线程时,都必须标识他们所操作线程持有的锁,只有同一锁上等待的线程,才可以被同一锁上的notify唤醒,而锁可以是任意对象,所以可以被任意对           象啊调用。

6.5. 生产者消费者问题

       利用jdk1.5的新特性,Lock替代了synchronized,Condition替代了Object类中的方法。实现Condition接口,将Object类里面的wait、notify、notifyAll方法分解成截然不同的对象,,一个锁上面可以有多个condition对象。

       Lock-->synchronized,lock中的newCondition方法生成新的锁对象

       Wait-->await

       Notify-->singles,singleAll

源代码参考:

classResource{    privateString name;    private int count =0;    Locklock = newReentrantLock();    privateBoolean flag = false;    Conditioncon_pro = lock.newCondition();    Conditioncon_cus = lock.newCondition();       public voidsetRes(String name) throwsException{       lock.lock();                 try {              while(flag){                  con_pro.await();              }              count = count+1;              System.out.println(Thread.currentThread().getName()+name+(count));                           flag = true;              con_cus.signal();           }finally{              lock.unlock();           }    }    public voidshowRes(String name)throwsException{       lock.lock();       try{           while(!flag){              con_cus.await();           }           System.out.println(Thread.currentThread().getName()+name+count);           flag = false;           con_pro.signal();       }finally{           lock.unlock();       }    }}classProducer implements Runnable{    privateResource res;    publicProducer(Resource res){       this.res =res;    }    @Override    public voidrun() {       // TODOAuto-generated method stub       while(true){           try {              res.setRes("生产者");           }catch (Exception e) {              // TODOAuto-generated catch block              e.printStackTrace();           }       }    }   }classConsumer implements Runnable{    privateResource res;    publicConsumer(Resource res){       this.res =res;    }    @Override    public voidrun() {       // TODOAuto-generated method stub       while(true){           try {              res.showRes("消费者");           }catch (Exception e) {              // TODOAuto-generated catch block              e.printStackTrace();           }       }    }}

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
0 0
原创粉丝点击