利用匿名内部类实现的过程:
package TestThread1;
/**
* 类描述:测试线程匿名内部类
*
* @author: 张宇
* @date: 日期: 2018年7月10日 时间: 上午9:43:16
* @version 1.0
*/
public class ThreadDemo {
static Object obj=new Object();
public static void main(String[] args) {new Thread() {
int x = 0;
public void run() {
while (x <= 100) {
synchronized (obj) {
if (x % 2 == 0) {
System.out.println(Thread.currentThread().getName()+ "--" + (x));
}else{
obj.notifyAll();
try {
obj.wait(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
x++;
}
}
}
}.start();
new Thread() {
int x = 0;
public void run() {
while (x <=100) {
synchronized (obj) {
if (x % 2 == 1){
System.out.println(Thread.currentThread().getName()+ "--" + x);
}else{
obj.notifyAll();
try {
obj.wait(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
x++;
}
}
}
}.start();
}
}
看到别人博客有个效率高的实现方法:就是记录线程的执行次数:
package TestThread1;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 类描述:最优方法打印0-100中的偶数和奇数 ,利用效率最高的方式
* @author: 张宇
* @date: 日期: 2018年8月26日 时间: 下午10:31:02
* @version 1.0
*/public class ThreadDemo3 {
private static volatile boolean flag = true;
private static AtomicInteger num = new AtomicInteger();
public static void main(String []args){
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (num.get() <= 100) {
if (!flag) {
System.out.println(Thread.currentThread().getName()+ num.getAndIncrement());
flag = true;
}
}
}
});
t1.setName("奇数:");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
while (num.get() <= 100) {
if (flag) {
System.out.println(Thread.currentThread().getName()+ num.getAndIncrement());
flag = false;
}
}
}
});
t2.setName("偶数:");
t1.start();
t2.start();
}
}
这种效率肯定比上面这种效率高!因为它只进行一次0-100的遍历;打印奇数和偶数,上面这种算法需要遍历两次0-100;分别取出里面的奇数和偶数。
【LeetCode(开辟两个线程,分别打印出0-100之中的奇数和偶数)】源码github地址:https://github.com/zhangyu345293721/leetcode
推荐阅读
- Integer常量池结合源码解析
- Java基础|Java 打印空心等腰三角形(方法2)
- gradle 每次运行都会下载依赖的解决办法
- 使用vector代替数组
- 如何获取ResultSet的行数和列数
- Java 时间戳格式化
- Java基础|Android开发——JVM、Dalvik以及ART的区别
- XML|XML报文转Map
- Java 8 时间,字符串和Long时间戳互转
- JAVA基础|JAVA基础(TreeMap键是Student值是String案例)