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/