3.多线程总结(2)

来源:互联网 发布:python读取xlsx文件 编辑:程序博客网 时间:2024/05/29 03:23

多线程间的通信
  多个线程处理同一个资源,但是处理动作
 不同。
1.线程通讯——等待唤醒机制:
  用boolean标记:
   例如:boolean flag=false;
    先判断标记
    为false时,wait():没有值,等待!
    为true时,有值,notify();唤醒,拿走!
    改变状态!(flag=false;)
 
2.调用下面方法时:(比喻定时回头抓人游戏)
  用同一同步(锁)对象调用:r.wait();r.notify();

  wait():可以让当前处于等待,这是的线程被
     临时存储到线程池中。

  notify():可以唤醒线程池中任意一个等待的线程

  notifyAll():唤醒线程池中所有的等待线程

  这些方法在使用时,必须要定义在同步中,必须被所属同步的锁对象来调用
3.示例:
  单生产单消费:
    publicsynchronized void set(String name)
 {
  if(flag)//这里为if
   try{wait();}catch(Exceptione){}
  this.name=name+"————"+count;
  count++;
  System.out.println("生产了,"+this.name);
  flag=true;
  notify();//这里为notify();
 }
   多生产多消费:(低效率)
    publicsynchronized void set(String name)
 {
  while(flag)//这里为while
   try{wait();}catch(Exceptione){}
  this.name=name+"————"+count;
  count++;
  System.out.println("生产了,"+this.name);
  flag=true;
  notifyAll();//这里为notifyAll();
 }
   多生产多消费:(高效率)
      使用Lock 接口:包名(java.util.concurrent.locks)
      Lock实现提供了比使用synchronized方法和语句可获得的更广泛的操作
    使用子类实现,比如ReentrantLock类:一个可重入的互斥锁lock,它具有
    和同步代码块(synchronized)方法和语句相同的功能,更加的面向对象。
    提供了显示操作。
     示例:
      import java.util.concurrent.locks.*;
      
      //创建对象
      Lock lock=new ReentrantLock();
      //获取锁
      lock.lock();
      //释放锁
      lock.unlock();
     常用:try{ lock.lock();……}fianlly{(不管怎样最后一定释放锁(lock.unlock();),否则其他线程不管用)}操作

4.Condition接口
  代码解释:
   1)同步代码块状态机制:
   synchronized(obj)
   {
    obj.wait();
    obj.notify();
    obj.notifyAll();
   }

   2)Lock和Condition状态机制:
   (更加面向对象,使用更加方便 )
    Locklock=new ReentrantLock();
    Conditioncon=lock.newCondition();
   lock.lock();
     
      con.await();
      con.signal();
      con.signalAll();(与synchronized对应)
     
   lock.unlock();
5.sleep和wait的区别?
  1,sleep必须指定时间,wait可以指定也可以不指定。
  2,sleep和wait 都可以让线程处于冻结状态,释放执行权。
  3,持有锁的线程执行sleep,不释放锁,持有锁的线程执行到wait释放锁。
  4, sleep到时间自动醒,wait没有时间限制,只有被唤醒(notify())。

6.线程的停止
  1,stop()方法:已经过时,具有不安全性。
  2,如果线程任务中需要定义循环语句,只要定义变量控制住循环,就可以
   控制线程的结束。
  3,Interrupted
    待了解

7.线程方法介绍
  1,setDaemon
   将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java虚拟机对出。
    调用时参照方法(线程对象.daemon();)
  2,join
   等待该线程终止 (throwsInterruptedException)
   示例:
    publicstatic void main(String[] args)
 {
      demo d=new demo("小强");
    demo d1=newdemo("校花");
    Threadt1=new Thread(d);
    Threadt2=new Thread(d1);

       try{
       t1.start();

       t1.join();//主线程等待t1线程结束,开始执行主线程
      
 t2.start();
 
 }catch(InterruptedException e)
 {}
       //主线程
       for(int i=0;i<20;i++)
         {
           System.out.println("我等"+(i+1));
  
 }
  3,优先级

8.开发小细节  
   线程常用:
   1,代码示例:内部类
    new Thread()
    {
     public void run()
     {
       ( 运行的代码)
     }
    }.start();
   2,代码示例: Runnable
     Runnable r=new Runnable()
     {
      public void run()
      {
       (运行的代码)
      }
     }
     new Thread(r).start();
    

 小记:
 得到线程名:Thread.currentThread().getName()

0 0
原创粉丝点击