java while和if的区别 用多线程来展示 两者的区别

while用于循环语句,而if用于判断和分支语句。
由于你并没有指明是什么程序,只能泛泛而谈了。
if 语句中,常用格式为:
if(判断条件){执行语句}
上面的结构,只是进行一次判断。
if与else结合,就可形成一个分支结构的语句,形如
if(判断条件1){执行语句1}
else if (判断条件2){执行语句2}
else if (判断条件3){执行语句3}
else if (...) {...}
else{执行语句n}
有些程序则用的是case,实际上与上面的else if等价。
While一般有两种形式
形式1:do{执行语句} While(判断条件),执行效果是先运行执行语句,再进行while条件判断,如果符合条件,则返回继续执行do后的执行语句,由此形成循环。
形式2:While(判断条件)do{执行语句},先进行判断,而运行执行语句。执行语句运行完毕,自动返回继续判断while中的条件是否符合,符合的话,继续运行执行语句,不符合,则退出循环。


总结


相同点:while与if语句的最大的相同点是都有至少一步的判断。
最大的不同点是:IF语句运行完毕后,接着运行下面的语句。而While中的执行语句运行完毕后,还要进行继续判断条件是否符合循环条件,根据判断的条件,再决定是否执行语句或继续运行下面的程序。

下面用一个多线程生产消费者来展现两者的区别

/**
 * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法,
 * 能够支持20个生产者线程以及100个消费者线程的阻塞调用
 * 
 * 使用wait和notify/notifyAll来实现
 * 
 * @author zfq
 */


import java.util.LinkedList;
import java.util.concurrent.TimeUnit;

public class MyContainer1<T> {
	final private LinkedList<T> lists = new LinkedList<>();
	final private int MAX = 10; //最多10个元素
	private int count = 0;
	
	
	public synchronized void put(T t) {
		while (lists.size() == MAX) { //想想为什么用while而不是用if?
			try {
				this.wait(); //effective java
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		lists.add(t);
		++count;
		this.notifyAll(); //通知消费者线程进行消费
	}
	
	public synchronized T get() {
		T t = null;
    /*想想为什么用while而不是用if?因为换成if之后notifyAll线程被唤醒之后
		就不会判断lists.size() == 0 ,继续执行下面的程序报错
		Exception in thread "c22" java.util.NoSuchElementException,为啥,因为你没判断,
		lists为空了,生产者可能还没来得及生产馒头,吃了个寂寞*/
		while(lists.size() == 0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		t = lists.removeFirst();
		count --;
		this.notifyAll(); //通知生产者进行生产
		return t;
	}
	
	public static void main(String[] args) {
		MyContainer1<String> c = new MyContainer1<>();
		//启动消费者线程
		for(int i=0; i<100; i++) {
			new Thread(()->{
				for(int j=0; j<50; j++) System.out.println(c.get());
			}, "c" + i).start();
		}
		
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		//启动生产者线程
		for(int i=0; i<20; i++) {
			new Thread(()->{
				for(int j=0; j<250; j++) c.put(Thread.currentThread().getName() + " " + j);
			}, "p" + i).start();
		}
	}
}

 


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值