题目
使用两个线程,一个打印数字,一个打印字母;交替打印,实现打印 1A2B3C4D;
1.思路说明:
1.1 要想实现双线程交替打印,首先得创建两个线程;使用实现runable接口方式创建两个线程;重写run方法,执行打印;
1.2 两个线程交替打印,是一种同步思想,需要让两个线程持有同一把锁(交替持有),可以利用synchronized修饰普通方法(相当于锁this对象,实现了两个线程同一把锁);
1.3 两个线程交替持有锁,持有锁的那个进行打印;没有锁的那个的等待;可以定义布尔类型变量控制实现反转;
1.4 使用wait()方法,让不应该打印的线程释放自己的对象锁;让该打印的线程拿着锁去打印;
1.5 打印完毕后,用notify()唤醒等待阻塞的另一个线程。并反转布尔变量,防止当前线程再次打印;
1.6 如此交替反复,实现交替打印;
2.代码实现:
2.1创建两个线程:
public class Test {
public static void main(String[] args) {
//使用两个线程,一个打印数字,一个打印字母;实现打印1A2B3C4D;
Myprint myprint=new Myprint();
//建第一个线程,打数字,共打印4次;
new Thread(()->{
for (int i = 1; i <=4 ; i++) {
myprint.printNum();
}
}).start();
//建第二个线程,打字母,打印四次;
new Thread(()->{
for (int i = 0; i < 4; i++) {
myprint.pringChar();
}
}).start();
}
}
2.2创建打印类及方法
class Myprint{
int count=0;//记录打印的轮数(也是初始数字1的前一个数字);
char c=64;//初始字母‘A’的前一个位置;
boolean flag=true;//用来判断该睡打印的布尔值,每个线程打印完反转,让另一个线打印;
//打印数字的方法
public synchronized void printNum() {
if (flag==false){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(++count);
flag=false;
notify();
}
//打印字母的方法
public synchronized void pringChar() {
if (flag==true){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//小心char类型参与运算会转换成int参与,结果为int,需要强转成char;
System.out.print((char)(c+count));
flag=true;
notify();
}
}