编写两个线程,一个线程打印1~52的整数,另一个线程打印字母 A ~ Z 。打印顺序为12A34B56C…5152Z。按照整数和字母的顺序从小到大打印,每打印两个整数后打印一个字母,交替循环,直到打印整数52和字母 Z 结束。
要求:
(1)编写打印类 Printer ,声明私有属
性 index ,初始值为1,用来表示是第几次打印。
(2)在打印类 Printer 中编写打印数字
的方法 print ( int i ),3的倍数就使用 wait ()方法等待,否则就输出 i ,使用 notifyAlIQ )唤醒其他线程。
(3)在打印类 Printer 中编写打印字母的方法 print ( char c ),如果不是3的倍数就等待,否则就打印输出字母 c ,使用 notifyAlI ()唤醒其他线程。
(4)编写打印数字的线程NumberPrinter 继承 Thread 类,声明私有属性 private Printer p ;在构造器中进行赋值,实现父类的 run 方法,调用 Printer 类中的输出数字的方法。
(5)编写打印字母的线程LetterPrinter 继承 Thread 类,声明私有属性 private Printer p ;在构造器中进行赋值,实现父类的 run 方法,调用 Printer 类中的输出字母的方法。
(6)编写测试类 Test ,创建打印类对象,创建两个线程类对象,启动线程。
package Thread;
public class PrintTest {
public static void main(String[] args) {
Printer p=new Printer();
NumberPrinter num=new NumberPrinter(p);
LetterPrinter let=new LetterPrinter(p);
num.start();
let.start();
}
}
class Printer{
private int index=1;
public synchronized void print(int i){
while(true) {
if(i>52){
this.notifyAll();//最后唤醒打印字母线程,不然打印不了Z
break;
}
if (index % 3 == 0) {
this.notifyAll();
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.print(" " + (i++) + " ");
index++;
}
}
}
public synchronized void print(char c){
//此处不用加if限制,因为打印字母需要打印数字线程唤醒
while(true) {
if (index % 3 != 0) {
this.notifyAll();
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.print(c++);
index++;
}
}
}
}
class NumberPrinter extends Thread{
private Printer p;
public NumberPrinter(Printer p){
this.p=p;
}
public void run(){
int i=1;
p.print(i);
}
}
class LetterPrinter extends Thread{
private Printer p1;
public LetterPrinter(Printer p1){
this.p1=p1;
}
public void run(){
char c='A';
p1.print(c);
}
}