题目:主线程和子线程完成交替打印,子线程先打印5次,主线程后打印5次,这样循环打印5轮。
解题思路:1.定义一个子线程,main方法代表主线程
2.定义一个boolean变量控制线程的切换
3.定义两个带同步锁的方法,一个是提供给子线程,一个提供给主线程
4.在主线程和子线程中分别循环5轮,在其中调用各自的方法
public class TestThreadPrint {
public static void main(String[] args) {
TestThreadPrint print = new TestThreadPrint();
//定义子线程
new Thread(new Runnable() {
@Override
public void run() {
//交替打印5轮
for (int i = 0; i < 5; i++) {
print.sonThreadMethod();
}
}
}).start();
//主线程
//交替打印5轮
for (int i = 0; i < 5; i++) {
print.mainThreadMethod();
}
}
//定义一个boolean值,决定该由哪个线程执行
static boolean flag = true;
public synchronized void sonThreadMethod() {
//当flag为true时,子线程打印,主线程wait
if (!flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Thread.currentThread().setName("子线程");
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+"打印第"+(i+1)+"次");
}
System.out.println("--------------------------------");
flag = false;
this.notify();
}
public synchronized void mainThreadMethod() {
//当flag为false时,主线程打印,子线程wait
if (flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Thread.currentThread().setName("主线程");
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+"打印第"+(i+1)+"次");
}
System.out.println("--------------------------------");
flag = true;
this.notify();
}
}
输出结果:
子线程打印第1次
子线程打印第2次
子线程打印第3次
子线程打印第4次
子线程打印第5次
--------------------------------
主线程打印第1次
主线程打印第2次
主线程打印第3次
主线程打印第4次
主线程打印第5次
--------------------------------
子线程打印第1次
子线程打印第2次
子线程打印第3次
子线程打印第4次
子线程打印第5次
--------------------------------
主线程打印第1次
主线程打印第2次
主线程打印第3次
主线程打印第4次
主线程打印第5次
--------------------------------
子线程打印第1次
子线程打印第2次
子线程打印第3次
子线程打印第4次
子线程打印第5次
--------------------------------
主线程打印第1次
主线程打印第2次
主线程打印第3次
主线程打印第4次
主线程打印第5次
--------------------------------
子线程打印第1次
子线程打印第2次
子线程打印第3次
子线程打印第4次
子线程打印第5次
--------------------------------
主线程打印第1次
主线程打印第2次
主线程打印第3次
主线程打印第4次
主线程打印第5次
--------------------------------
子线程打印第1次
子线程打印第2次
子线程打印第3次
子线程打印第4次
子线程打印第5次
--------------------------------
主线程打印第1次
主线程打印第2次
主线程打印第3次
主线程打印第4次
主线程打印第5次
--------------------------------