【Java面试题】多线程交替打印
2020-02-05 本文已影响0人
Children乏
数组一:{“1”,“2”,“3”,...,“26”}
数组二:{“A”,“B”,“C”,...,“Z”}
使用两个线程交替打印:“A1B2C3D4E5F6...”
使用LinkedTransferQueue
public static void main(String[] args) {
final char[] nums = "123456".toCharArray();
final char[] words = "ABCDEF".toCharArray();
final LinkedTransferQueue<Object> ltq = new LinkedTransferQueue<>();
new Thread(new Runnable() {
@Override
public void run() {
for (char num : nums) {
try {
// take方法是个阻塞方法
System.out.print(ltq.take());
// transfer方法是个阻塞方法
ltq.transfer(num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (char word : words) {
try {
// transfer方法是个阻塞方法
ltq.transfer(word);
// take方法是个阻塞方法
System.out.print(ltq.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
执行结果
A1B2C3D4E5F6
take、transfer均为阻塞方法
LinkedTransferQueue:
-
容量为0
-
类似套袖:
-
左边给右边递(transfer)东西,左边会一直举(阻塞)着,直到右边取(take)走;
-
左边向右边取(take)东西,左边会一直举(阻塞)着,直到右边交(transfer)出;