笔记:线程通讯

1、共享内存同步对象

 A_Thread.java

class A_Thread implements Runnable{
	private Signal signal;//传入的共享对象
	public A_Thread(Signal signal){
		this.signal=signal;
	}
	@Override
	public void run() {
		signal.print();
	}
}

B_Thread.java

public class B_Thread implements Runnable{
	private Signal signal;
	public B_Thread(Signal signal){
		this.signal=signal;
	}
	@Override
	public void run() {
		signal.print();
	}
}

Signal .java //锁对象

public class Signal {
	private boolean flag=false;
	synchronized public void print(){
		System.out.println(flag);
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

Test.java //共享的对象

public class Test {
	public static void main(String[] args) throws InterruptedException {
		Signal signal=new Signal();
		new Thread(new A_Thread(signal)).start();
		new Thread(new B_Thread(signal)).start();
	}
}

本质就是通过一个共享Signal,每次访问时都给资源加锁,这样第二个线程就会等待第一个线程睡眠2秒后才获得资源Signal的flag。


2、常用的flag,A线程设置一下flag,B、线程获取flag。

B线程的run()方法。

@Override
public void run() {
	while(true){
		if(flag==true){
			//doSomeThing();
		}
	}	
}
3、通过 wait(),notify()和notifyAll()。

A_Thread.java

class A_Thread implements Runnable {
	private Signal signal;// 传入的共享对象
	private String name;
	public A_Thread(Signal signal,String name) {
		this.signal = signal;
		this.name=name;
	}
	@Override
	public void run() {
		synchronized (signal) {
			while (true) {
				long temp=System.currentTimeMillis();
				try {
					System.out.println(name+"开始等待:"+temp);
					signal.wait();
					System.out.println(name+"结束等待:"+(System.currentTimeMillis()-temp));
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

B_Thread.java

public class B_Thread implements Runnable{
	private Signal signal;
	public B_Thread(Signal signal){
		this.signal=signal;
	}
	@Override
	public void run() {
		try {
			System.out.println("10s开始唤醒");
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		synchronized(signal){
			signal.notifyAll();
		}
	}
}

Signal.java

public class Signal {}

Test.java

public class Test {
	public static boolean flag =false;
	public static void main(String[] args) throws InterruptedException {
		Signal signal=new Signal();
		for(int i=0;i<4;i++){
			new Thread(new A_Thread(signal,i+"")).start();
		}
		new Thread(new B_Thread(signal)).start();
	}
}

1、通过同步对象来调用wait(),notify(),notifyall() 。

2、为了调用wait()或者notify(),线程必须先获得那个对象的锁。也就是说,线程必须在同步块里调用wait()或者notify()。

3、关键字synchronized可以对对象添加对象锁(可以参考http://www.cnblogs.com/hapjin/p/5452663.html),然后我们就可以在同步块中调用。


参考:http://ifeve.com/thread-signaling/




 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值