1.使用synchronized关键字时,可使用wait() , notify() , notifyAll()进行线程通信控制
**可以自定义一个变量作为标志位结合使用。
**调用wait()导致的程序阻塞并不是死锁。
2.使用LOCK对象时,可使用Condition进行线程通信控制
import java.util.concurrent.locks.*;
class x{
private ReentrantLock lock=new ReentrantLock();
private Condition con=lock.newCondition();
boolean flag=true;
private void needLock(){
lock.lock();
try{
//code
if(!flag)
con.await();
else
con.signalAll();
}
catch(Exception e){//使用Condition方法时需要捕获异常或声明抛出
System.out.println(e);
}
finally{
lock.unlock();
}
}
public static void main(String args[]){
}
}
3.使用阻塞队列BlockingQueue控制线程通信
作为线程同步的工具 ,且有特征:
当生产者线程试图从BlockingQueue中放入元素,如果队列已满,则该线程被阻塞;
当消费者线程试图从BlockingQueue中取出元素,如果队列已空,则该线程被阻塞。
BlockingQueue包含以下实现类:
import java.util.concurrent.*;
class x extends Thread{
private int i=1;
private BlockingQueue<String> bq=null;
x(BlockingQueue<String> bq){
this.bq=bq;
}
public void run(){
try{
bq.put("Put "+i);//放入元素
System.out.println(getName()+" "+bq);
i++;
}
catch(Exception e){
System.out.println(e);
System.out.println(getName()+" - FULLED");
}
}
public static void main(String args[]){
BlockingQueue<String> bq=new ArrayBlockingQueue<String>(1);
new x(bq).start();
new x(bq).start();
new y(bq).start();
}
}
class y extends Thread{
private BlockingQueue<String> bq=null;
y(BlockingQueue<String> bq){
this.bq=bq;
}
public void run(){
try{
bq.take();
System.out.println(getName()+" "+bq);
}
catch(Exception e){
System.out.println(e);
System.out.println(getName()+" - EMPTY");
}
}
}
输出结果: