JAVA学习:线程通信

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");
		}
	}
}
			

输出结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值