实现多线程通信输出 1 2 A 3 4 B 5 6 C 7 8 D 9 10 E 11 12 F 13 14 G 15 16 H 17 18 I 19 20 J 21 22 K 23 24 L 25 26 M 27 28 N 29 30 O 31 32 P 33 34 Q 35 36 R 37 38 S 39 40 T 41 42 U 43 44 V 45 46 W 47 48 X 49 50 Y 51 52 Z
用多线程之间的通信,实现上面的输出,一个线程输出数字,另外一个线程输出字母
定义两个lock,一个是lockNum用来控制数字的输出,另外一个是lockChar用来控制字母的输出。可以把输出数字的线程看成生产者,输出字母的线程看成消费者。
public class Producer implements Runnable {
private Object lockNum;
private Object lockChar;
public Producer(Object lockNum, Object lockChar) {
this.lockNum = lockNum;
this.lockChar = lockChar;
}
@Override
public void run() {
synchronized (lockNum) {
for (int i = 1; i <= 52; i++) {
System.out.print(" " + i + " ");
if (i % 2 == 0) {
try {
synchronized (lockChar) {
lockChar.notify();
}
lockNum.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
消费者代码如下(输出字母的线程):
public class Consumer implements Runnable {
private Object lockNum;
private Object lockChar;
public Consumer(Object lockNum, Object lockChar) {
this.lockNum = lockNum;
this.lockChar = lockChar;
}
@Override
public void run() {
synchronized (lockChar) {
try {
lockChar.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
for (char c = 'A'; c <= 'Z'; c++) {
System.out.print(c);
try {
synchronized (lockNum) {
lockNum.notify();
}
lockChar.wait(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
测试程序代码如下:
public class ThreadCommunicationTest {
public static void main(String[] args) {
Object lockNum = new Object();
Object lockChar = new Object();
Thread t1 = new Thread(new Consumer(lockNum, lockChar));
Thread t2 = new Thread(new Producer(lockNum, lockChar));
t1.start();
t2.start();
}
}
其中Consumer中的lockChar.wait()加了时间限制,确保该线程能够推出。