1. 程式人生 > >LeetCode:開闢兩個執行緒,分別打印出0-100之中的奇數和偶數

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;分別取出裡面的奇數和偶數。