使用conditionn
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
new Thread(() -> {
int i = 'a';
while (i <= 'z') {
lock.lock();
int[] arr = {'a', 'e', 'i', 'o', 'u'};
if (juge(arr, i)) {
try {
i++;
condition2.signal();
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
System.out.println("線程1"+(char)i);
i++;
}
}).start();
new Thread(() -> {
lock.lock();
try {
int[] arr = {'a', 'e', 'i', 'o', 'u'};
for (int i : arr) {
System.out.println("線程2:"+(char)i);
condition1.signal();
condition2.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}).start();
}
private static boolean juge(int[] arr, int i) {
for (int i1 : arr) {
if (i == i1) {
return true;
}
}
return false;
}
注意 ,condition必須要在lock的範圍裏面,不然會狀態異常。java.lang.IllegalMonitorStateException
使用管道,將線程2要打印的數據傳送了過去
//兩個線程分別打印26個字母的元音(a,e,i,o,u) 和輔音(其他),
//要求按字母序輸出
public static void main(String[] args) throws IOException {
ReentrantLock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
PipedOutputStream out = new PipedOutputStream();
PipedInputStream input = new PipedInputStream();
out.connect(input);
new Thread(() -> {
int i = 'a';
while (i <= 'z') {
lock.lock();
int[] arr = {'a', 'e', 'i', 'o', 'u'};
if (juge(arr, i)) {
try {
out.write(i);
condition2.signal();
condition1.await();
i++;
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
System.out.println("線程1" + (char) i);
i++;
}
}).start();
new Thread(() -> {
lock.lock();
try {
while (true) {
int i = input.read();
System.out.println("線程2:" + (char) i);
condition1.signal();
condition2.await();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}).start();
}
private static boolean juge(int[] arr, int i) {
for (int i1 : arr) {
if (i == i1) {
return true;
}
}
return false;
}