LeetCode:開闢兩個執行緒,分別打印出0-100之中的奇數和偶數
阿新 • • 發佈:2019-01-28
利用匿名內部類實現的過程:
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;分別取出裡面的奇數和偶數。