方法一、
package com.pp.test03;
public class MainClass {
public static void main(String[] args) {
Object object = new Object();
Thread t0 = new Alp(object);
Thread t1 = new Num(object);
t1.start();
t0.start();
}
}
package com.pp.test03;
public class Num extends Thread {
private Object object;
public Num(Object object) {
super();
this.object = object;
}
@Override
public void run() {
synchronized (object) {
for (int i = 1; i < 53; i++) {
System.out.println(i);
if (i % 2 == 0) {
try {
object.notifyAll();
object.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
package com.pp.test03;
public class Alp extends Thread {
private Object object;
public Alp(Object object) {
super();
this.object = object;
}
@Override
public void run() {
synchronized (object) {
for (int i = 0; i < 26; i++) {
System.out.println((char) (97 + i));
try {
object.notifyAll();
object.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
方法二、
package com.pp.test04;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class MainClass {
public static void main(String[] args) {
Mycoo coo = new Mycoo();
Thread t0 = new Alp(coo);
Thread t1 = new Num(coo);
t1.start();
t0.start();
}
}
class Mycoo {
String flag = "n";
public ReentrantLock lock = new ReentrantLock();
public Condition con_a = lock.newCondition();
public Condition con_n = lock.newCondition();
}
package com.pp.test04;
public class Num extends Thread{
private Mycoo coo;
public Num(Mycoo coo) {
super();
this.coo = coo;
}
@Override
public void run() {
coo.lock.lock();
for(int i=1;i<53;i++) {
if(coo.flag.equals("n")) {
System.out.println(i);
if(i%2==0) {
coo.flag="a";
coo.con_a.signal();
try {
coo.con_n.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
coo.lock.unlock();
}
}
package com.pp.test04;
public class Alp extends Thread{
private Mycoo coo;
public Alp(Mycoo coo) {
super();
this.coo = coo;
}
@Override
public void run() {
coo.lock.lock();
for(int i =0;i<26;i++) {
if(coo.flag.equals("a")) {
System.out.println((char)(97+i));
coo.flag="n";
coo.con_n.signal();
try {
coo.con_a.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
coo.lock.unlock();
}
}
方法三、
package com.pp.test05;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class MainClass {
public static ReentrantLock lock = new ReentrantLock();
public static Condition con1 = lock.newCondition();
public static Condition con2 = lock.newCondition();
public static void main(String[] args) {
Alp a = new Alp();
Num n = new Num();
Thread t0 = new Thread(a);
Thread t1 = new Thread(n);
t1.start();
t0.start();
}
}
package com.pp.test05;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Num implements Runnable{
ReentrantLock lock = MainClass.lock;
Condition c1 = MainClass.con1;
Condition c2 = MainClass.con2;
@Override
public void run() {
lock.lock();
for(int i=1;i<53;i++) {
System.out.println(i);
if(i%2==0) {
c2.signal();
try {
c1.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
lock.unlock();
}
}
package com.pp.test05;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Alp implements Runnable{
ReentrantLock lock = MainClass.lock;
Condition c1 = MainClass.con1;
Condition c2 = MainClass.con2;
@Override
public void run() {
lock.lock();
for(int i=0;i<26;i++) {
System.out.println((char)(97+i));
c1.signal();
try {
c2.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.unlock();
}
}