LeetCode(开辟两个线程,分别打印出0-100之中的奇数和偶数)

利用匿名内部类实现的过程:

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

    推荐阅读