public class ThreadTest {
public static void main(String[] args) {
final PrintNum pn = new PrintNum();
// 使用同一个对象执行任务
new Thread(new Runnable() { // 打印奇数线程
public void run() {
for (int i = 0;
i < 5;
i++) { // 执行5次,即遍历100内的数
pn.printEven();
}
System.out.println("first thread stop !");
}
}).start();
new Thread(new Runnable() { // 打印偶数线程
public void run() {
for (int i = 0;
i < 5;
i++) {
pn.printOdd();
}
System.out.println("second thread stop !");
}
}).start();
}
【开启2个线程分别交替打印10个奇数和偶数(100以内)】}
class PrintNum {
private int cur = 0;
private boolean printOddFlag = true;
// 打印odd的标志位// 打印10个奇数
public synchronized void printOdd() { if (!printOddFlag) {
try {
// 释放对象锁
// 线程在获取对象锁后,主动释放对象锁,同时本线程休眠
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} for (int i = cur;
i < cur + 20;
i += 2) {
System.out.println(Thread.currentThread().getName() + ":" + i + " ");
}
printOddFlag = false;
// 对象锁的唤醒操作
// 唤醒其他所有进程(其实只有一个),线程执行到此不是立即释放对象锁,而是要退出synchronized代码块后,当前线程才会释放对象锁
this.notify();
}// 打印10个偶数
public synchronized void printEven() { if (printOddFlag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = cur + 1;
i < cur + 1 + 20;
i += 2) {
System.out.println(Thread.currentThread().getName() + ":" + i + " ");
}
cur += 20;
// 偶数线程从此初始值开始
printOddFlag = true;
this.notify();
}
}
推荐阅读
- shiro的作用和执行流程总结
- 黑马程序员18-4(【day18集合泛型 练习与总结】)
- 05|循环得到resultset中的值
- JavaSE|JAVA8反射获取方法参数名
- javaSE|javaEE JDBC, dbutils插件, 事务
- javaSE 第三方插件commons-dbutils, 操作数据库的工具类, QueryRunner类, (update() 增、删、改操作)
- javaSE 第三方插件commons-dbutils, 操作数据库的工具类, QueryRunner类, (query() 查询操作)
- 邮件开发(邮件作用、邮件服务器、电子邮箱与邮件客户端软件)
- 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
- javase|创建两个线程,其中一个输出1-52,另外一个输出A-Z。输出格式要求(12A 34B 56C 78D 依次类推)