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

  wait():可以让当前处于等待,这是的线程被
     

 

 

  这些方法在使用时,必须要定义在同步中,必须被所属同步的锁对象来调用
3.示例:
  单生产单消费:
    public synchronized void set(String name)
 {
  if(flag)//这里为if
   try{wait();}catch(Exception e){}
  this.name=name+"————"+count;
  count++;
  System.out.println("生产了,"+this.name);
  flag=true;
  notify();//这里为notify();
 }
   多生产多消费:(低效率)
    public synchronized void set(String name)
 {
  while(flag)//这里为while
   try{wait();}catch(Exception e){}
  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();
     

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

  2)Lock和Condition状态机制:
    (更加面向对象,使用更加方便 )
    Lock lock=new ReentrantLock();
    Condition con=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释放锁。
 

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

7.线程方法介绍
  1,setDaemon
    将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java虚拟机对出。
    调用时 参照方法(线程对象.daemon();)
  2,join
   等待该线程终止 (throws InterruptedException)
   示例:

public static void main(String[] args)
{
demo d=new demo("小强");
demo d1=new demo("校花");
Thread t1=new Thread(d);
try{
t1.join();//主线程等待t1线程结束,开始执行主线程

t2.start();

}catch(InterruptedException e)
{}
//主线程
for(int i=0;i<20;i++)
{
System.out.println("我等"+(i+1));
}
}


 

8.开发小细节  
   线程常用:
   1,代码示例:内部类

new Thread()
{
public void run()
{
( 运行的代码)
}
}.start();


   2,代码示例: Runnable

Runnable r=new Runnable()
{
public void run()
{
(运行的代码)
}
}
new Thread(r).start();


    

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