LeetCode:0-100の奇数と偶数をそれぞれ印刷する2つのスレッドを開きます

2468 ワード

匿名の内部クラスを使用して実装されるプロセス:
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();		
	}
}

この効率はきっと上の効率より高いに違いない.1回に0-100の遍歴しか行わないからです.奇数と偶数を印刷します.このアルゴリズムは0-100を2回巡回する必要があります.中の奇数と偶数をそれぞれ取り出します.
ソースgithubアドレス:https://github.com/zhangyu345293721/leetcode