1、实现的synchronized版本
/**
* 子线程5次,主线程循环10次 ,如此50次 synchronized版
* @author feng
*
*/
public class Cirle105Demo {
public static void main(String[] args) {
final Done done = new Done();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<50; i++){
done.sub(i);
}
}
}).start();
for(int i=0; i<50; i++){
done.main(i);
}
}
}
//将子线程执行和主线程执行,封装成对象的行为
class Done{
//ture时子线程执行,false时主线程执行
private Boolean flag = true;
public synchronized void sub(int j){
if(!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1; i<=5; i++){
System.out.println("sub thread--"+i+"---"+j);
}
flag = false;
this.notify();
}
public synchronized void main(int j){
if(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1; i<=10; i++){
System.out.println("main thread--"+i+"---"+j);
}
flag = true;
this.notify();
}
}
2、实现的lock版本
/**
* 子线程5次,主线程循环10次 ,如此50次 lock版
* @author feng
*
*/
public class Cirle105Demo {
public static void main(String[] args) {
final Done done = new Done();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<50; i++){
done.sub(i);
}
}
}).start();
for(int i=0; i<50; i++){
done.main(i);
}
}
}
//将子线程执行和主线程执行,封装成对象的行为
class Done{
//ture时子线程执行,false时主线程执行
private Boolean flag = true;
//定义锁
private Lock lock = new ReentrantLock();
//去掉synchronized后,this.wait()将不能再用
private Condition condition = lock.newCondition();
public void sub(int j){
//上锁
lock.lock();
try {
if(!flag){
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1; i<=5; i++){
System.out.println("sub thread--"+i+"---"+j);
}
flag = false;
condition.signal();
} catch (Exception e) {
//最后必须释放锁
lock.unlock();
e.printStackTrace();
}
}
public void main(int j){
lock.lock();
try {
if(flag){
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1; i<=10; i++){
System.out.println("main thread--"+i+"---"+j);
}
flag = true;
condition.signal();
} catch (Exception e) {
//最后必须释放锁
lock.unlock();
e.printStackTrace();
}
}
}