编写两个线程,一个线程打印1-52的整数,另一个线程打印A-Z的字母,打印顺序为:12A34B56C…5152Z
要求:
- 打印类Printer存在私有属性index,用于表示当前打印次数
- index不是3的倍数就调用打印数字的方法print(int i),输出i,并唤醒其他所有等待线程;不是就调用等待方法
- index是3的倍数就调用打印字母的方法print(char c),输出c,并唤醒其他所有等待线程;不是就调用等待方法
- 打印数字的线程类NumberPrinter必须继承Thread类,并有私有属性Printer p,p在其构造方法中被赋值,在重写父类的run方法中调用Printer类的数字打印方法
- 打印字母的线程类LetterPrinter必须继承Thread类,并有私有属性Printer p,p在其构造方法中被赋值,在重写父类的run方法中调用Printer类的字母打印方法
- 测试类Test创建打印类、两个线程类的对象并启动线程
- 使用三种同步方法实现
1.使用同步代码块实现
略
2.使用同步方法实现
/**
* 功能:打印类
*/
public class Printer {
private int index=1;//用来表示当前打印次数
//无参构造方法
public Printer() {
}
//打印数字的方法
public synchronized void print(int i){
if(index % 3 == 0) {//如果是3的倍数
try {
wait();//数字打印线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//否则
System.out.println(i);//打印数字
notify();//唤醒所有等待字母打印线程
index++;//打印次数加1
}
//打印字母的方法
public synchronized void print(char c){
if(!(index % 3 == 0)){//如果不是3的倍数
try {
wait();//字母打印线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//否则
System.out.println(c);//打印字母
notifyAll();//唤醒所有等待数字打印线程
index++;//打印次数加1
}
}
-------------------------------------------------------------------------------------------
/**
* 功能:数字打印线程类
*/
public class NumberPrinter extends Thread {//继承Thread类
private Printer p;//定义私有打印类属性p
//进行p赋值的构造方法
public NumberPrinter(Printer p){
this.p=p;
}
//重写父类的run方法
@Override
public void run() {
int i=1;//初始数字1
while(i<=52){//如果数字小于53
p.print(i);//调用Printer类的数字打印方法
i++;//每打印一次,数字增加1
}
}
}
-------------------------------------------------------------------------------------------
/**
* 功能:字母打印线程类
*/
public class LetterPrinter extends Thread {//继承Thread类
private Printer p;//定义私有打印类属性p
//进行p赋值的构造方法
public LetterPrinter(Printer p){
this.p=p;
}
//重写父类的run方法
@Override
public void run() {
char c=65;//初始字母A
while(c<=90){//如果小于字母Z
p.print(c);//调用Printer类的字母打印方法
c++;//每打印一次,字母增加1
}
}
}
-------------------------------------------------------------------------------------------
/**
* 功能:测试类
*/
public class Test {
public static void main(String[] args) {
//创建打印类对象
Printer p=new Printer();
//创建数字打印线程类的对象
Thread numberThread=new NumberPrinter(p);
//启动数字打印线程
numberThread.start();
//创建字母打印线程类的对象
Thread letterThread=new LetterPrinter(p);
//启动字母打印线程
letterThread.start();
}
}
3.使用重入锁实现
/**
* 功能:打印类
*/
public class Printer {
private int index=1;//用来表示当前打印次数
private Lock lock=new ReentrantLock();//创建一个共享锁
private Condition numberPrintCondition=lock.newCondition();//创建数字打印队列
private Condition letterPrintCondition=lock.newCondition();//创建字母打印队列
//无参构造方法
public Printer() {
}
//打印数字的方法
public void print(int i){
lock.lock();//加锁
try{
if(index % 3 == 0) {//如果是3的倍数
try {
numberPrintCondition.await();//数字打印线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//否则
System.out.println(i);//打印数字
letterPrintCondition.signalAll();//唤醒所有等待字母打印线程
}finally {
lock.unlock();//解锁
}
index++;//打印次数加1
}
//打印字母的方法
public void print(char c){
lock.lock();//加锁
try{
if(!(index % 3 == 0)){//如果不是3的倍数
try {
letterPrintCondition.await();//字母打印线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//否则
System.out.println(c);//打印字母
numberPrintCondition.signalAll();//唤醒所有等待数字打印线程
}finally {
lock.unlock();//解锁
}
index++;//打印次数加1
}
}
-------------------------------------------------------------------------------------------
/**
* 功能:数字打印线程类
*/
public class NumberPrinter extends Thread {//继承Thread类
private Printer p;//定义私有打印类属性p
//进行p赋值的构造方法
public NumberPrinter(Printer p){
this.p=p;
}
//重写父类的run方法
@Override
public void run() {
int i=1;//初始数字1
while(i<=52){//如果数字小于53
p.print(i);//调用Printer类的数字打印方法
i++;//每打印一次,数字增加1
}
}
}
-------------------------------------------------------------------------------------------
/**
* 功能:字母打印线程类
*/
public class LetterPrinter extends Thread {//继承Thread类
private Printer p;//定义私有打印类属性p
//进行p赋值的构造方法
public LetterPrinter(Printer p){
this.p=p;
}
//重写父类的run方法
@Override
public void run() {
char c=65;//初始字母A
while(c<=90){//如果小于字母Z
p.print(c);//调用Printer类的字母打印方法
c++;//每打印一次,字母增加1
}
}
}
-------------------------------------------------------------------------------------------
/**
* 功能:测试类
*/
public class Test {
public static void main(String[] args) {
//创建打印类对象
Printer p=new Printer();
//创建数字打印线程类的对象
Thread numberThread=new NumberPrinter(p);
//启动数字打印线程
numberThread.start();
//创建字母打印线程类的对象
Thread letterThread=new LetterPrinter(p);
//启动字母打印线程
letterThread.start();
}
}