开辟两个线程,分别打印出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;分别取出里面的奇数和偶数。

猜你喜欢

转载自blog.csdn.net/zy345293721/article/details/82085200