分析:
其中一个线程负责打印数字,另一个线程负责打印字母,但有一个特点就是数字刚好是字母的2倍(字母26,数字52),数字一次打印2个,字母打印一个,并且字母打印线程一定是在数字打印线程之后才打印的。
如何控制字母打印线程一定是在数字打印线程之后,并且数字和字母还是交替出现的?
我们可以考虑用信号量来控制,假若说:当信号量为1的时候告诉打印数组线程执行,当数字是2的时候,让打印字母的线程执行,然后唤醒数字打印线程,又把数字改为1。
我们需要注意以下几点:
- 在每一次打印完之后要把flag的值改掉,并且唤醒下一个线程
- count什么时候++呢?在它打印完一个字母后这才算一个小流程完了,所以是在字母打印线程之后count++
- 还有就是在进行字母打印的时候,要对count-1,因为count的初值是1,再加’A’就是B了,所以要先对count-1,完了之后要把它强转成char
package www.java.test;
class Print{
int flag = 1;
int count = 1;
public synchronized void printNum(){
while(flag != 1){
//此时应该打印字母,让打印数字线程等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//打印数字
System.out.print(2*count - 1);
System.out.print(2*count);
flag = 2;
notify();
}
public synchronized void printChar(){
while(flag != 2){
//此时应该打印数字,字母打印线程等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print((char)(count-1 + 'A'));
//继续前行
count++;
flag = 1;
notify();
}
}
public class Test{
public static void main(String[] args) {
Print print = new Print();
new Thread(()->{
for(int i = 0; i < 26; i++){
print.printNum();
}
}).start();
new Thread(()->{
for(int i = 0; i < 26; i++){
print.printChar();
}
}).start();
}
}