多线程间的通信:
多个线程处理同一个资源,但是处理动作
不同。
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)
示例:
8.开发小细节
线程常用:
1,代码示例:内部类
2,代码示例: Runnable
小记:
得到线程名:Thread.currentThread().getName()