精华内容
下载资源
问答
  • java中死循环是什么意思 循环一次不再循环是死循环 还是不断循环才是死循环 能否简单的举个死循环单身例子
  • python:for循环是怎么工作的

    千次阅读 2019-04-08 16:14:08
    for...in是Python程序员使用最多的语句,for 循环用于迭代容器对象中的元素,这些对象可以是列表、元组、字典、集合、文件,甚至可以是自定义类或者函数,例如: 作用于列表 作用于元组 作用于字符串 ...

    for...in 是Python程序员使用最多的语句,for 循环用于迭代容器对象中的元素,这些对象可以是列表、元组、字典、集合、文件,甚至可以是自定义类或者函数,例如:

    作用于列表

     

    作用于元组

     

    作用于字符串

     

    作用于集合

     

    作用于字典

     

    作用于文件

     

    可能有人不经要问,为什么这么多不同类型对象都支持 for 语句,还有哪些类型的对象可以作用在 for 语句中呢?回答这个问题之前,我们先要了解 for 循环背后的执行原理。

    for 循环是对容器进行迭代的过程,什么是迭代?迭代就是从某个容器对象中逐个地读取元素,直到容器中没有更多元素为止。那么,哪些对象支持迭代操作?任何对象都可以吗?先随便自定义一个类试试,看行不行:

     

    错误堆栈日志非常清楚地告诉我们,MyRange 不是一个可迭代对象,所以它不能用于迭代,到底什么样的对象才称得上是可迭代对象(iterable)呢?

    可迭代对象需要实现__iter__方法,并返回一个迭代器,迭代器(Iterator)只需要实现 __next__方法。现在我们就来验证一下列表为什么支持迭代:

     

    从试验结果来看,列表是一个可迭代对象,因为它实现了 __iter__方法,并且返回了一个迭代器对象(list_iterator)因为它实现了 __next__方法我们看到它不断地调用__next__方法,其实就是不断地迭代获取容器中的元素,直到容器中没有更多元素抛出 StopIteration 异常为止。

    那么 for 语句又是如何循环的呢?到这里,恐怕你也猜到了,它的步骤是:

    先判断对象是否为可迭代对象,不是的话直接报错,抛出TypeError异常,是的话,调用 __iter__方法,返回一个迭代器

    不断地调用迭代器的__next__方法,每次按序返回迭代器中的一个值

    迭代到最后,没有更多元素了,就抛出异常 StopIteration,这个异常 python 自己会处理,不会暴露给开发者

    对于元组,字典,字符串也是同样的道理,弄明白了 for 的执行原理之后,我们就可以实现自己的迭代器用在 for 循环中。

    前面的 MyRange 报错是因为它没有实现迭代器协议里面的这两个方法,现在继续改进:

     

    因为它实现了__next__方法,所以 MyRange 本身已经是一个迭代器了,所以 __iter__返回的就是对象本身 self。现在用在 for 循环中试试:

     

    你会发现 MyRange 功能和内建函数 range很相似。for 循环本质是不断地调用迭代器的__next__方法,直到出现 StopIteration 异常退出循环。所以任何可迭代对象都可以作用在for循环中。

    展开全文
  • 多线程中的忙循环是什么?

    千次阅读 2018-02-26 09:56:02
    循环就是程序员用循环让一个线程等待,不像传统方法wait(), sleep() 或 yield() 它们都放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存,在多核系统中,一个等待线程...
            忙循环就是程序员用循环让一个线程等待,不像传统方法wait(), sleep() 或 yield() 它们都放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存,在多核系统中,一个等待线程醒来的时候可能会在另一个内核运行,这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。
    展开全文
  • 自从有了jdk8,我的foreach循环从原来的 for(String s:list){ System.out.println(s); } 潇洒的变成了 list.stream.foreach((s) -> { System.out.println(s); }); 或者更风流的 list.forEach...

    自从有了jdk8,我的foreach循环从原来的

    for(String s:list){

    System.out.println(s);

    }

    潇洒的变成了

    list.stream.foreach((s) ->

    {

    System.out.println(s);

    });

    或者更风流的

    list.forEach(System.out::println);

    那么问题来了,java8是可以支持并行循环的,也就是说在循环体内多线程执行。

    经笔者测试,平常使用

    list.foreach(() ->{

    });

    list.stream.foreach(() ->{

    });时是单线程的,这么写:

    list.parallelStream().forEach((s) ->{
            System.out.println("lambda表达式的线程;;;"+Thread.currentThread().getId());
    });

    时候,才会是多线程并行处理的哦。

    不信你看:

    展开全文
  • }死循环是如何跳出的 @Override public void run ( ) { while ( true ) { try { /** * mBlockingQueue会在线程内声明如下 * private final BlockingQueue<String> mBlockingQueue; * ...

    Java中 终止线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作。

    在 Java 中有以下 3 种方法可以终止正在运行的线程:

    1. 使用退出标志,使线程正常退出,也就是当 run() 方法完成后线程中止

    2. 使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据不符合完整性,所以被废弃。So, forget it!

    3. 使用 interrupt 方法中断线程。注意使用interrupt()方法中断正在运行中的线程只会修改中断状态位,可以通过isInterrupted()判断。如果使用interrupt()方法中断阻塞中的线程,那么就会抛出InterruptedException异常,可以通过catch捕获异常,然后进行处理后终止线程。有些情况,我们不能判断线程的状态,所以使用interrupt()方法时一定要慎重考虑

    使用volatile标志位

    看一个简单的例子:

    首先,实现一个Runnable接口,在其中定义volatile标志位,在run()方法中使用标志位控制程序运行。

    public class MyRunnable implements Runnable {
     
    	//定义退出标志,true会一直执行,false会退出循环
    	//使用volatile目的是保证可见性,一处修改了标志,处处都要去主存读取新的值,而不是使用缓存
    	public volatile boolean flag = true;
     
    	public void run() {
    		System.out.println("第" + Thread.currentThread().getName() + "个线程创建");
    		
    		try {
    			Thread.sleep(1000L);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		
    		//退出标志生效位置
    		while (flag) {
    		}
    		System.out.println("第" + Thread.currentThread().getName() + "个线程终止");
    	}
    }
    

    然后,在main()方法中创建线程,在合适的时候,修改标志位,终止运行中的线程。

    public class TreadTest {
    	public static void main(String[] arg) throws InterruptedException {
    		MyRunnable runnable = new MyRunnable();
    		
    		//创建4个线程
    		for (int i = 0; i < 4; i++) {
    			Thread thread=new Thread(myRunable,i+"   ");
    			thread.start();
    		 }
    		//线程休眠
    		Thread.sleep(2000L);
    		System.out.println("——————————————————————————");
    		//修改退出标志,使线程终止
    		runnable.flag = false;	
    	}
    }
    

    最后,运行结果,如下:
    在这里插入图片描述

    使用interrupt()中断的方式

    需要明确的一点的是:interrupt() 方法并不像在 for 循环语句中使用 break 语句那样干脆,马上就停止循环。调用 interrupt() 方法仅仅是在当前线程中打一个停止的标记,并不是真的停止线程

    也就是说,线程中断并不会立即终止线程,而是通知目标线程,有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。这一点很重要,如果中断后,线程立即无条件退出,那么我们又会遇到 stop() 方法的老问题。

    事实上,如果一个线程不能被 interrupt,那么 stop 方法也不会起作用。

    我们来看一个使用 interrupt() 的例子:

    public class InterruptThread1 extends Thread{
    
        public static void main(String[] args) {
            try {
                InterruptThread1 t = new InterruptThread1();
                t.start();
                Thread.sleep(200);
                t.interrupt();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void run() {
            super.run();
            for(int i = 0; i <= 200000; i++) {
                System.out.println("i=" + i);
            }
        }
        
    }
    

    在这里插入图片描述
    从输出的结果我们会发现 interrupt 方法并没有停止线程 t 中的处理逻辑,也就是说即使 t 线程被设置为了中断状态,但是这个中断并不会起作用,那么该如何停止线程呢?

    这就需要使用到另外两个与线程中断有关的方法了:

    public boolean Thread.isInterrupted() //判断是否被中断
    public static boolean Thread.interrupted() //判断是否被中断,并清除当前中断状态
    

    这两个方法使得当前线程能够感知到是否被中断了(通过检查标志位)。

    所以如果希望线程 t 在中断后停止,就必须先判断是否被中断,并为它增加相应的中断处理代码:

    @Override
    public void run() {
        super.run();
        for(int i = 0; i <= 200000; i++) {
            //判断是否被中断
            if(Thread.currentThread().isInterrupted()){
                //处理中断逻辑
                break;
            }
            System.out.println("i=" + i);
        }
    }
    

    输出结果,for 循环在执行完成前就提前结束了:
    在这里插入图片描述
    在上面这段代码中,我们增加了 Thread.isInterrupted() 来判断当前线程是否被中断了,如果是,则退出 for 循环,结束线程。

    这种方式看起来与之前介绍的“使用标志位终止线程”非常类似,但是在遇到 sleep() 或者 wait() 这样的操作,我们只能通过中断来处理了

    public static native void sleep(long millis) throws InterruptedException
    

    Thread.sleep() 方法会抛出一个 InterruptedException 异常,当线程被 sleep() 休眠时,如果被中断,这会就抛出这个异常。
    (注意:Thread.sleep() 方法由于中断而抛出的异常,是会清除中断标记的。)

    使用stop()中断

    通过查看 JDK 的 API,我们会看到 java.lang.Thread 类型提供了一系列的方法如 start()、stop()、resume()、suspend()、destory()等方法来管理线程。但是除了 start() 之外,其它几个方法都被声名为已过时(deprecated)

    虽然 stop() 方法确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且该方法已被弃用,最好不要使用它。

    • 为什么弃用stop:
      调用 stop() 方法会立刻停止 run() 方法中剩余的全部工作,包括在 catch 或 finally 语句中的,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭
      调用 stop() 方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题。
      例如,存在一个对象 u 持有 ID 和 NAME 两个字段,假如写入线程在写对象的过程中,只完成了对 ID 的赋值,但没来得及为 NAME 赋值,就被 stop() 导致锁被释放,那么当读取线程得到锁之后再去读取对象 u 的 ID 和 Name 时,就会出现数据不一致的问题,如下图:
      在这里插入图片描述

    while(true){i++;}死循环是如何跳出的

    @Override
        public void run() {
            while (true){
                try {
                    /**
                     * mBlockingQueue会在线程内声明如下
                     * private final BlockingQueue<String> mBlockingQueue;
                     * 线程初始化时会对mBlockingQueue赋值
                     * */
                    String string = mBlockingQueue.take();
                    Log.d("wuyazhouHttp","string: "+string);
                } catch (InterruptedException e) {//捕捉异常
                    if (mQuit) {
                        Log.d("wuyazhouHttp","线程结束");
                        return;
                    }
                    Log.d("wuyazhouHttp","string: 阻塞列表为空");
                    continue;
                }
            }
        }
    
    public void quit() {
        mQuit = true;//更新标志位
        interrupt();//调用interrupt()方法中断阻塞并抛出一个异常
    }
    

    首先会更新标志位可以结束线程,其次调用interrupt()方法中断阻塞并抛出一个异常,然后就能调用第二段代码中的return终止进程

    展开全文
  • python循环之for循环

    万次阅读 多人点赞 2018-10-16 14:39:38
    python还有个循环是for循环。 for循环一般用于遍历元组、集合、列表这种数据类型里面的所有元素。(字典只会遍历索引) #简单的for循环结构(不同于while循环容易变成无限循环,for循环遍历完或中止便会结束运行...
  • do while 循环和while循环的区别

    万次阅读 多人点赞 2014-07-20 00:53:18
    1、do while循环是先执行循环体,然后判断循环条件,如果为真,则执行下一步循环,否则终止循环;  while循环是先判断循环条件,如果条件为真则执行循环体; 2、do while循环条件后面必须有一个分号,这个...
  • 三种循环语句都可以处理同一问题,一般情况下可以相互替代 for循环,功能最强大,最灵活,感觉最...而do-while循环是先执行循环体,再去判断表达式,因此,它最少执行一次 在循环次数一致的情况下,建议使用for循...
  • 增强for循环(foreach循环

    千次阅读 2020-03-16 19:34:15
    /** * 标题:增强for循环(foreach循环) ... * 答:foeach循环是专门针对于简写for循环的一种循环,它只可以用于遍历数组的每个值 * 格式:for(循环变量类型 循环变量名称 : 要被遍历的对象){ * 循环体 * } *...
  • SAS循环

    千次阅读 2019-01-08 18:54:53
    在SAS循环是通过使用DO语句来完成的,它也被称为DO循环。DO循环主要分为两类:DO WHILE 和 DO UNTIL。 一、SAS DO UNTIL 循环 DO UNTIL循环使用UNTIL条件。重复执行SAS语句,直到UNTIL条件变为TRUE。 语法: DO ...
  • 循环结构 在上节,我们学习了选择结构,有两种方法实现: If语句 Switch语句 today,我们接触一种全新的程序结构——循环结构,它能让代码更加有趣儿~ so,什么是循环结构?当某个条件成立时,周而复始地做某些...
  • Python中for循环和while循环

    千次阅读 2018-06-27 19:55:10
    for循环和while循环是python中仅有的两种循环,今天就来讲一下这两种循环的用法 for循环 (1)Python中for循环在形式上与其他语言有较大的不同,以下是C#中for循环和Python中的for循环 C#的for循环: for(int i = 0...
  • 1. for循环当中定义的初始化变量,只有自己才能用;...for循环和while循环是【先判断后执行】,但是do-while循环是【先执行后判断】。举例:如果条件从来没有满足过,for循环和while循环将会执行0次,但是d...
  • Linux for循环之列表for循环

    万次阅读 2017-07-22 12:38:28
    for循环是Linux shell 中最常用的结构。for 循环有三种结构:一种结构是列表for循环;第二种结构是不带列表for循环;第三种结构是类C风格的for循环。 本篇博文重点看列表for循环,列表for循环大的格式固定,在列表...
  • 若在for循环中,还会执行下一次循环吗?】 return的用法是什么,若在for循环中,还会执行下一次循环吗? 一、背景介绍 什么是return? return 语句的作用是从当前函数退出,并从那个函数返回一个值。 用 ...
  • for循环和while循环的相互转换

    千次阅读 2019-07-22 18:00:19
    for循环和while循环都是我们能经常用到的方法。...然而这两种循环是可以相互转换的eg: 下面分别时while和for的死循环格式 再例如: while程序: 结果: for程序: 结果: 可见for里面不一定非得是(...
  • 什么是循环依赖? 顾名思义,循环依赖就是A依赖B,B又依赖A,两者之间的依赖关系形成了一个圆环,通常是由于不正确的编码所导致。Spring只能解决属性循环依赖问题,不能解决构造函数循环依赖问题,因为这个问题无解...
  • 以前用的时候忽略了这个问题,今天测试了一下,发现break之后跳出全部循环,不是跳出本次循环 for (int i=0; i7; i++) {  NSLog(@"===%d",i);  if (i>4) {  break;  } } 输出 2016-08-18 11:07:08.529 ...
  • while循环和do--while循环

    千次阅读 2017-10-07 20:16:07
    简单来讲就是说while循环是先判断后循环, 判断如果满足条件进入循环 本次循环后再次判断
  • 流程控制 for循环

    千次阅读 2020-10-23 09:24:10
    因此在 bash 脚本中,for 循环是非常流行的构造。 实现一个 for 循环,很自然的,要用 for 命令。在现代版的 bash 中,有两种可用的 for 循环格式。 for: 传统 shell 格式 原来的 for 命令语法是: for ...
  • 有以下程序段 int k=0; while(k=1) k++; 则while 循环执行的次数是:( ) A) 无限次 B) 有语法错,不能执行 C) 一次也不执行 D) 执行1次 为什么是a
  • Linux for循环之类C风格for循环

    千次阅读 2017-07-23 18:34:39
    for循环是Linux shell 中最常用的结构。for 循环有三种结构:一种结构是列表for循环;第二种结构是不带列表for循环;第三种结构是类C风格的for循环。上篇博文讲解了不带列表for循环,本篇博文重点看类C风格for循环。...
  • FME创建循环

    千次阅读 2018-07-18 09:38:35
    循环是程序结构允许一部分重复执行,通常,这用于迭代,重复执行某个过程,逐步缩小范围,通常循环连接一个条件,即循环停止的条件。 注意:在FME中,循环只能在自定义转换器中创建   循环创建 除了数据的流入...
  • Java while循环

    千次阅读 2019-04-17 17:33:06
    开发工具与关键技术:Myeclipse 10,Java 作者:刘俊杰 撰写时间:2019年04月16日 While循环由四个结构组成:初始化、条件判断、循环体、迭代。 在循环刚开始时,会计算一次“布尔...While循环是先判断,后执行的...
  • do-while循环和while循环的区别是do-while的循环体至少被执行一次,
  • Js死循环

    千次阅读 2019-01-27 18:13:12
    Js死循环是怎么造成的呢!其实在我们写代码时一些不注意或漏写,就写出死循环,就如下面代码: 如果i++没有写上,这个就是死循环了,死循环的后果想知道的自己不防去试试。 不过有时候需要用到死循环,但写法不是...
  • for-each 循环

    万次阅读 多人点赞 2018-12-07 14:35:23
    for-each循环是Java相比C语言中的for循环拓展而来的一种新的遍历数组的循环方式,其相对于一般的for循环更方便,而且更易查找数组内的变量,他与我们常见的for循环不同的是,for循环是通过循环控制变量,访问数组中...
  • /* 一、while循环 循环语句:可以让一部分代码反复执行 while循环: 编写格式: while(条件){ 循环体 } 条件:当条件为true,就执行循环体,执行完循环体后 程序再次执行while中的条件,如果条件还是...
  • shell循环loop

    万次阅读 2014-11-01 13:02:28
    1. 循环 shell循环,不断执行某段程序,直到符合条件...while循环是一直执行,直到条件不符合,才停止。 3. until循环 until循环和while相反,当条件condition成立时,终止循环。 4. for固定循环 for为已知次数的循环。
  • 循环移位:循环左移和循环右移

    万次阅读 多人点赞 2018-04-30 15:35:46
    换句话说,循环移位就是将移出的低位放到该数的高位(循环右移)或把移出的高位放到该数的低位(循环左移),左移,和右移动都是对整数进行的操作,在Win32控制台应用程序中,整形占4Byte节32bit。 &nbsp; &...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 278,046
精华内容 111,218
关键字:

循环是