精华内容
下载资源
问答
  • 什么用WHILE不能遍历输出表一个很普通查询输出函数现在表中有10条数据调用的时候因为要把结果转成XML所以不能在函数体里做echo但是这样调用只能输出最后一条记录,求能在调用页面输出整表内容的方法调用echo main_...

    为什么用WHILE不能遍历输出表

    一个很普通查询输出函数现在表中有10条数据

    调用的时候因为要把结果转成XML所以不能在函数体里做echo

    但是这样调用只能输出最后一条记录,求能在调用页面输出整表内容的方法

    调用

    echo main_shopactive();

    函数体

    function main_shopactive()

    {

    //商场活动查询,返回逆向排序的最后一条活动记录

    $conn = mysql_connect_conn();

    $sql = "SELECT * FROM wx_active order by id desc limit 0,30";

    $rs = mysql_db($sql,$conn) or die('查询记录失败!');

    if(mysql_num_rows($rs) > 0)

    {

    while($row = mysql_fetch_assoc($rs))

    {

    $my_active = $row['concent'];

    }

    }

    else

    {

    $my_active = 'NO ACTIVE';

    }

    return $my_active;

    }

    展开全文
  • 关于生产者模式,想必大家也...​ 当生产的时候需要判断容器中是否已经满,为什么这个判断需要用while不能用if呢,例如下面代码中第7行 public class MyContainer1<T> { final private LinkedList<T&g...

    关于生产者模式,想必大家也非常了解了,其中java实现的一个简易模型:生产者在一个固定容量的容器中加入元素,通知消费者消费,消费者消费后通知生产者生产

    当生产的时候需要判断容器中是否已经满,为什么这个判断需要用while而不能用if呢,例如下面代码中第7行

    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中提倡wait,while一起使用
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		lists.add(t);
    		++count;
    		this.notifyAll(); //通知消费者线程进行消费
    	}
    	
    	public synchronized T get() {
    		T t = null;
    		while(lists.size() == 0) {
    			try {
    				this.wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		t = lists.removeFirst();
    		count --;
    		this.notifyAll(); //通知生产者进行生产
    		return t;
    	}
    	
    }
    

    一开始我一直在疑惑,put方式不是加了synchronized吗,为什么要循环判断来防止其它线程过多添加元素?了解到了锁获取/释放的机制,终于得出了答案:

    因为wait会释放锁!

    结合代码第7行,当容器满了的时候,第一个线程拿到锁,进入到while块内,调用wait方法并释放了锁。第二个线程也能拿到锁,遇到wait同样会等待

    这时线程1,线程2,都在wait处等待了!!,这是问题的关键

    当消费者消费了1个元素,调用了notiftyAll方法,线程1和线程2都唤醒了,它们会竞争锁,假设线程1拿到了锁,这时线程2继续在锁池中阻塞。

    线程1直接到执行下面的代码增加元素,增加完后容器已经满(MAX)

    但是线程1执行完,会释放锁,又因为线程2此时是醒着的,它将得到线程1释放的锁,继续从wait()处往下执行。如果是if,它不作判断就直接往满的容器中加元素,造成错误。如果是while,线程2往下执行时会再次进入到while判断。因为此时容器已经满了,所以线程2,再次被wait,保证了数据的安全

    展开全文
  • 当有多个消费者的时候,还使用if判断是否await就会产生问题,这是因为一个生产者消费者模型的任务队列,一个消费者一次放入多个任务,然后notifyAll通知消费者,但是并非所有被唤醒的消费者都取到一个任务,那么...
    多线程的情况下,单个生产者和单个消费者用if判断是否await不会出错;当有多个消费者的时候,还使用if判断是否await就会产生问题,这是因为一个生产者消费者模型的任务队列,一个消费者一次放入多个任务,然后用notifyAll通知消费者,但是并非所有被唤醒的消费者都能取到一个任务,那么队列被读空了之后的消费者肯定得继续await。如果你用if来判断,这个消费者第二次被notify的时候就不会再次判断这个条件了,如果这个时候这个消费者又一次没抢到任务,但是代码还是往下执行了,轻则空指针异常,重了干出什么事情来都说不定了。所以必须用while来检查,这样可以保证每次被唤醒都会检查一次条件。
    展开全文
  • 最近在研究wait和notify方法,发现有个地方要注意,但是网上又说得不是很明白的地方,就是经典的生产者和消费模式,使用wait和notify实现,判断list是否为空的这个为什么用while不能使用if呢?其实是因为当线程...

        最近在研究wait和notify方法,发现有个地方要注意,但是网上又说得不是很明白的地方,就是经典的生产者和消费模式,使用wait和notify实现,判断list是否为空的这个为什么要用while而不能使用if呢?其实是因为当线程wait之后,又被唤醒的时候,是从wait后面开始执行,而不是又从头开始执行的,所以如果用if的话,被唤醒之后就不会在判断if中的条件,而是继续往下执行了,如果list只是添加了一个数据,而存在两个消费者被唤醒的话,就会出现溢出的问题了,因为不会在判断size是否==0就直接执行remove了。但是如果使用while的话,从wait下面继续执行,还会返回执行while的条件判断,size>0了才会执行remove操作,所以这个必须使用while,而不能使用if来作为判断。

        以下代码是一个简单的实践,参考:http://www.cnblogs.com/hapjin/p/5492645.html(做了适当的调整)
         Add类,负责添加数据:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class Add {
        private String lock;
        public Add(String lock) {
            super();
            this.lock = lock;
        }
        public void add() {
            synchronized (lock) {
                ValueObject.list.add("anyString");
                lock.notifyAll();
            }
        }
    }
    public class ThreadAdd extends Thread {
        private Add p;
        public ThreadAdd(Add p) {
            super();
            this.p = p;
        }
        @Override
        public void run() {
            p.add();
        }
    } 
        Subtract类,负责删除数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public class Subtract {
        private String lock;
        public Subtract(String lock) {
            super();
            this.lock = lock;
        }
        public boolean check() {
            System.out.println("check");
            return true;
        }
        public void subtract() {
            try {
                synchronized (lock) {
                    if(check() && ValueObject.list.size() == 0) {//将这里的if改成while即可保证不出现越界异常!!!!
                        System.out.println("wait begin ThreadName="
                                + Thread.currentThread().getName());
                        lock.wait();
                        System.out.println("wait   end ThreadName="
                                + Thread.currentThread().getName());
                    }
                    ValueObject.list.remove(0);
                    System.out.println("list size=" + ValueObject.list.size());
                }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public class ThreadSubtract extends Thread {
        private Subtract r;
        public ThreadSubtract(Subtract r) {
            super();
            this.r = r;
        }
        @Override
        public void run() {
            r.subtract();
        }
    }
        封装的List队列:
    public class ValueObject {
        public static List list = new ArrayList();
    } 
        测试类:
    复制代码
    public class Run {
        public static void main(String[] args) throws InterruptedException {
            String lock = new String("");
            Add add = new Add(lock);
            Subtract subtract = new Subtract(lock);
            ThreadSubtract subtract1Thread = new ThreadSubtract(subtract);
            subtract1Thread.setName("subtract1Thread");
            subtract1Thread.start();
            ThreadSubtract subtract2Thread = new ThreadSubtract(subtract);
            subtract2Thread.setName("subtract2Thread");
            subtract2Thread.start();
            Thread.sleep(1000);
            ThreadAdd addThread = new ThreadAdd(add);
            addThread.setName("addThread");
            addThread.start();
        }
    }
    复制代码

    转载自:https://www.cnblogs.com/ismallboy/p/6785302.html

    展开全文
  • 我买的是小米wifi,但是小米wifi对应的客户端不是很好,动动就启动失败,不要问我为什么不用命令行直接开启wifi,只能说小米的这个wifi太傲娇了,总是开启失败,所以所以了360wifi的客户端,只是同样会出现错误,之后...
  • do...while{0}有什么好处

    2017-09-05 09:44:14
    当你执行一段代码到一半,想跳过剩下的一半的时候,如果你正处于do while循环中,则能用break达到这个目的。 do {  我执行.  我执行..  我再执行…  if (有什么条件满足了我)  {  呀,我想跳到另外一段代码了...
  • 由其中一名玩家随意说出一个小于10的数字,剩下的一位玩家往上累加,但累加后的数字不能带7,或者是7的倍数也不行。比如说17,或者21。一个里面带7,一个是7的倍数。若遇到这种数字可以直接跳过。那...
  • 还是有点模糊,那假如我想读取一种文件,我在读之前并知道它是二进制,还是字符型的,即知道他是音频文件,图型文件,还是文件,那我应该用什么样的方法呢. 估计我是对java读取文件的时候怎样编码,怎样解码,其过程不是...
  • 由其中一名玩家随意说出一个小于10的数字,剩下的一位玩家往上累加,但累加后的数字不能带7,或者是7的倍数也不行。比如说17,或者21。一个里面带7,一个是7的倍数。若遇到这种数字可以直接跳过。那...
  • 当然,不管是什么东西都可能做到完美,就拿汽车来说,即便是几百万上千万的豪车也是有缺点的,更何况普通的十几万的家用车。因此,大家在选车的时候,要记住的是买一款适合自己的车型就行,没必要因为虚荣心而花大...
  • 由其中一名玩家随意说出一个小于10的数字,剩下的一位玩家往上累加,但累加后的数字不能带7,或者是7的倍数也不行。比如说17,或者21。一个里面带7,一个是7的倍数。若遇到这种数字可以直接跳过。那...
  • 由其中一名玩家随意说出一个小于10的数字,剩下的一位玩家往上累加,但累加后的数字不能带7,或者是7的倍数也不行。比如说17,或者21。一个里面带7,一个是7的倍数。若遇到这种数字可以直接跳过。那...
  • 由其中一名玩家随意说出一个小于10的数字,剩下的一位玩家往上累加,但累加后的数字不能带7,或者是7的倍数也不行。比如说17,或者21。一个里面带7,一个是7的倍数。若遇到这种数字可以直接跳过。那...
  • 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 是不是老阔疼,想递归,但是有for又不行,抓狂! 别慌,我们来分析分析,既然乘除不了,那么n^2+n...
  • 解压缩的时候在第291个数据处开始读到EOF,之后所有的数据fgetc读都是EOF。也就是说只有前面291个是正常数据,后面全写了-1进去,生成一个文件 附程序 //4.27添加修改0的模块,并避免溢出情形 #ifndef _...
  • 看到了 for-else/while-else的代码, 往往不能马上搞懂 else 处代码的意思因为, 脑袋不能马上反应, else 到底表示了什么样的语义( 还需要转几个弯 )(但是 try - except -else 没有带来语义上的歧义)相关代码能否一...
  • 编写了一个蓝牙通讯的上位机,和单片机通讯,目前串口通讯助手测试的时候发现,每次给蓝牙串口发一个大串数据的时候,手机上接收到的总是分段显示 比如我发一个“123456789123456789123456789” 手机上接收到则...
  • 答案是不能 比如 for i in range(10): print(i) if i==5: i=0 这段代码依旧只执行10次,而并不是C++中那样能够无限执行 为什么呢?因为在python中for中修改i只会对当前这次的循环体有效,所以可以通过...
  • 的是Qt 5.4.1 for Windows 32-bit (MinGW 4.9.1, 856 MB).sqlite3 32位的. ...知道这是什么原因?之前在32位系统上都正常运行.难道是我的这个系统是64位的原因吗? 如果不用sqlite3.sqlite好像也不行.同样的问题.
  • 最近在自动化构建toolchain的时候,在shell脚本中运行 binary 时,提示...刚开始感觉很奇怪,在目录下能查看到对应的可执行文件,为什么不能执行呢。而且ldd $binary 的时候,显示this is not an executing bina
  • 当你执行一段代码到一半,想跳过剩下的一半的时候,如果你正处于do while循环中,则能用break达到这个目的。如下伪代码: do { 我执行 我执行。。 我再执行。。。 if (有什么条件满足了我) { 呀,我
  • 当然在我们的系统业务流程上也是可以有循环存在的,比如重复添加数据,登录界面如果密码错误不能登录的时候就是返回到登录界面,等等这些业务场景需要循环来操作.一.While循环直接上例子:a=1while a<10:print(a)a+...
  • 当然在我们的系统业务流程上也是可以有循环存在的,比如重复添加数据,登录界面如果密码错误不能登录的时候就是返回到登录界面,等等这些业务场景需要循环来操作.一.While循环直接上例子:a=1while a<10:print(a)a+...
  • 在这里,我有一个疑惑,我这样建堆是无法遍及root的,假设根结点和其左孩子逆序,这里parent计算的结果是0,无法进入循环,所以根节点总是不能动的 循环结束的条件又无法改变,仅当parent=-1/2取整为0时结束循环,...
  • 其他的不能限制 if (true) { var num = 100 } console.log(num) // 100 </code></pre> <code>// let 声明的变量,除了函数可以限制,所有的代码块都可以限制其作用域(if/while/for/...&...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 282
精华内容 112
关键字:

while什么时候不能用