Object lock = new Object();
char[] a1 = "1234567".toCharArray();
char[] a2 = "ABCDEFG".toCharArray();
Thread t1 = new Thread(()->{
for(int i = 0; i < a1.length;i++){
synchronized (lock){
if(!isRun2){
System.out.print(a1[i]);
try {
isRun2 = true;
lock.notify();
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
});
new Thread(()->{
for(int i = 0; i < a2.length;i++){
synchronized (lock){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(a2[i]);
isRun2 = false;
lock.notify();
}
}
}).start();
t1.start();// 先打印的一定要后启动
写法2
Lock lock = new ReentrantLock();
Condition c1 = lock.newCondition();
Condition c2 = lock.newCondition();
char[] a1 = "1234567".toCharArray();
char[] a2 = "ABCDEFG".toCharArray();
Thread t1 = new Thread(()->{
lock.lock();
for(int i = 0; i < a1.length;i++){
System.out.print(a1[i]);
c2.signal();
try {
c1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.unlock();
});
new Thread(()->{
lock.lock();
for(int i = 0; i < a2.length;i++){
try {
c2.await();
System.out.print(a2[i]);
c1.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.unlock();
}).start();
t1.start();// 先打印的一定要后启动
BlockingQueue
BlockingQueue<String> b1 = new ArrayBlockingQueue<>(1);
BlockingQueue<String> b2 = new ArrayBlockingQueue<>(1);
char[] a1 = "1234567".toCharArray();
char[] a2 = "ABCDEFG".toCharArray();
Thread t1 = new Thread(()->{
for(int i = 0; i < a1.length;i++){
System.out.print(a1[i]);
try {
b1.put(" b2 go");
b2.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();// 先打印的一定要后启动
new Thread(()->{
for(int i = 0; i < a2.length;i++){
try {
b1.take();
System.out.print(a2[i]);
b2.put(" t1 go");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();