精华内容
下载资源
问答
  • 思考时被打断
    千次阅读
    2019-06-20 23:56:42

    最近在温习Java Thread的各种状态变化,想到Thread.join方法的用法:当前线程阻塞到被join线程结束后才继续执行。于是我翻了以下Thread.join方法的源码,如下图:

    在发现join方法内部其实使用wait方法来实现的,我立即想到了对应的notify/notifyAll方法,当时就想着既然是用wait进行线程休眠,我是不是可以用notify/notifyAll来进行唤醒?打破join引起的阻塞?

    1、有想法就实践吧,第一次的测试代码:

    public static void testJoin() {
            final Thread thread = new Thread() {
                @Override
                public void run() {
                    for (int i = 0; i < 10; i++) {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            System.out.println("InterruptedException from sleep");
                        }
                        System.out.println("thread running: " + i);
                    }
    
                }
            };
    
            thread.start();
    
            (new Thread(() -> {
                try {
                    Thread.sleep(1000 * 6);
                    synchronized (thread) {
                        thread.notifyAll(); // wake wait status
                    }
                    System.out.println("notify join thread");
                } catch (InterruptedException e) {
                    System.out.println(e.getClass().getName() + " is thrown 1");
                }
            }
            )).start();
            try {
                thread.join();
            } catch (InterruptedException e) {
                System.out.println(e.getClass().getName() + " is thrown 2");
            }
            System.out.println("main is running after join!");
        }

    运行结果如下:

    thread running: 0
    thread running: 1
    thread running: 2
    notify join thread
    thread running: 3
    thread running: 4
    thread running: 5
    thread running: 6
    thread running: 7
    thread running: 8
    thread running: 9
    main is running after join!

    结果显示,main线程调用join的代码处并没有解除阻塞状态,于是我返回join源码处仔细查看,wait代码处被唤醒后代码会如何执行呢?这才发现wait被while循环包围,终止条件是被join的thread已经执行完成(isAlive()),好吧,这才是join方法的目的:被join线程执行完成后当前线程才能继续执行。这次实验加深了我对join方法的理解,同时也引发了另一个问题的思考:join的thread执行完成后,join方法中的wait状态是怎么被唤醒的呢?在JDK源码中找了好一会也没找到答案,后来在网上搜了下,有人说是JVM内部实现的,在thread执行完毕后进行的唤醒(c++代码),暂时记录一下,以后有机会研究JVM源码的时候再求证一下,参考链接:https://www.jianshu.com/p/fc51be7e5bc0

    2、上面的第一次尝试并没有实现我的需求,后来我在看到Thread的interrupt相关知识点时,又想起来这个问题。以下是我的第二次尝试,最终结果是main线程跳出join阻塞状态继续运行了,也就是说join阻塞状态是可以被打断的,实现方式就是使用线程的interrupt方法。

    public static void testJoin() {
            final Thread thread = new Thread() {
                @Override
                public void run() {
                    for (int i = 0; i < 10; i++) {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            System.out.println("interruptedException thrown by sleep!");
                        }
                        System.out.println("thread running: " + i);
                    }
    
                }
            };
    
            thread.start();
    
            final Thread mainThread = Thread.currentThread();
            (new Thread(() -> {
                try {
                    Thread.sleep(1000 * 10);
                    mainThread.interrupt();
                    System.out.println("notify join thread");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            )).start();
    
    
            try {
                thread.join();
            } catch (InterruptedException e) {
                System.out.println(e.getClass().getName() + " is thrown~");
            }
            System.out.println("main is running after join!");
        }

    运行结果如下:

    thread running: 0
    thread running: 1
    thread running: 2
    thread running: 3
    thread running: 4
    notify join thread
    java.lang.InterruptedException is thrown~
    main is running after join!
    thread running: 5
    thread running: 6
    thread running: 7
    thread running: 8
    thread running: 9

    这里有一点需要说的是,需调用mainThread的interrupt方法,而不是被join线程的interrupt方法,因为执行join方法中的wait代码段的当前线程是main线程,被阻塞的也是main线程,被join线程在wait处只是作为竞争资源和锁监控对象。实际测试,如果调用被join线程的interrupt方法,只会打断被join线程run方法中的sleep(2000)的休眠状态。

    总结一下,Thread的interrupt操作可以让线程从wait/sleep/join等休眠状态中恢复过来并抛出InterruptedException异常,附上interrupt方法的注释。

    更多相关内容
  • 1、当一个irq/fiq正在执行 ,是否可能会其它的irq/fiq打断呢? 如果开启了中断优先级,则在irq/fiq进入的时候,也会再次enalbe irq/fiq,即也就是支持了中断嵌套。 所以此时一个irq或fiq正在执行的时候,它是有...

    快速链接:
    .
    👉👉👉 个人博客笔记导读目录(全部) 👈👈👈


    说明:
    在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 5.14

    先说结论

    • 1、当一个irq/fiq正在执行时 ,是否可能会其它的irq/fiq打断呢?
    • 如果开启了中断优先级,则在irq/fiq进入的时候,也会再次enalbe irq/fiq,即也就是支持了中断嵌套。
      所以此时一个irq或fiq正在执行的时候,它是有可能被另外一个高优先级的irq/fiq num的中断抢占的。
      但是很遗憾,在我们的Linux Kernel系统中,至今都没有默认开启中断优先级,在一进入irq/fiq的时候,也没有再次enable irq/fiq. 所以这种情况下,一个正在执行的irq/fiq是不可能被另外的irq/fiq打断的。
    • 2、当一个irq/fiq正在执行时 ,是否可能会其它异常打断呢?
      当然可以,您仔细阅读代码就会发现,在一进入irq/fiq handler的时候,PSTATE.DPSTATE.A都是被enabled,所以irq/fiq正在执行的时候,是可能被WatchpointBreakpointSoftware Step exceptionsSerror打断的
    • 3、当一个irq/fiq正在执行时 ,还会被别的程序打断吗?
      当然可以,同步异常嘛!

    代码/文档导读

    (1) 如下代码展示了,在一进入irq/fiq的时候,就调用enable_daPSTATE.DPSTATE.A unmasked了。
    所以irq/fiq中断,是可以被WatchpointBreakpointSoftware Step exceptionsSerror打断的
    在这里插入图片描述
    (2) irq和fiq属于异步异常,具有同样的优先级。而同步异常的优先级又高于异步异常的优先级,同意异常的优先级如下所示(也就意味着以下同步异常都可以打断正在执行的irq/fiq):
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    (3)如果开启了中断优先级,则在irq/fiq进入的时候,也会再次enalbe irq/fiq
    在这里插入图片描述


    在这里插入图片描述
    《ARMv8/ARMv9架构学习系列课程》全系列,共计51节课,超15h的视频课程

    展开全文
  • 一旦思路中断,我们也许得花20分钟才能重新将它找回。 2.对程序员来说,在游戏X中增加一项功能也许容易,但这并不意味着在游戏Y中添加新功能也会很容易。因为就其本质来说,任何两款游戏的内部架构都完全不同。 ...

    程序员是怎样的一群人?

    1.我们的工作通常涉及到对复杂系统的深入思考。在思考过程中,我们可能需要投入很长时间,所以若非遇到急事,请不要打乱我们的思路。一旦思路被中断,我们也许得花20分钟才能重新将它找回。

    2.对程序员来说,在游戏X中增加一项功能也许容易,但这并不意味着在游戏Y中添加新功能也会很容易。因为就其本质来说,任何两款游戏的内部架构都完全不同。

    3.欲速则不达。如果我们试图走捷径,就将有可能埋下技术隐患。与事后赶工修改相比,我们更愿意多花点时间,一次就把事情做对了。

    4.我们对项目/任务完成日期的预估有可能出错,如果我们在任务进行过程中提议修改截止日期,请不要感到吃惊。

    5.一旦我着手做某项任务,就只有到完成任务时才能停得下来——无论那需要花多少时间。所以,你最好事先告诉我你的时间安排。

     

    6.5分钟做不了任何事情。只有傻子才会相信那些所谓的“简单解决方案”。

    7.如果我的沟通方式让你觉得太直率,请多多包涵,因为程序员有时会习惯于将逻辑简化。

    8.如果我没能完全实现您的需求,那肯定是交流出了问题。我做事喜欢化繁为简——如果你希望我以某种特别方式做某件事,请你给出具体的成功标准。

    9.我们并不总是擅长求助他人。倘若管理层能够看到我们的问题并予以帮助,那就再好不过了。

    想成为程序员,想掌握编程,关注小编吧

    免费学习书籍:

    免费学习资料:

    10.虽然我是一名程序员,但这并不意味着我有能力处理项目所需的所有技术问题。

     

    展开全文
  • Unity Animator状态切换打断探索

    千次阅读 2020-08-18 17:38:38
    一、前言 最近在研究animator的时候Interruption Source用法的耗费了我很长时间,因为在了解的过程中在网上大多都是官方文档的译文,首先感谢我...所以我在刚触发A-B就立即触发A-C,即Interruption没有效果, 后来

    一、前言

    最近在研究animator的时候Interruption Source用法的耗费了我很长时间,因为在了解的过程中在网上大多都是官方文档的译文,首先感谢我参考的译文,但是按照译文操作测试结果和官方结果并一样,于是作为一个挠头的程序员又在不断搜索,最终发现救命稻草,其中
    神来之笔
    这句话点醒了我,小菜鸟恍然大悟。

    二、错误思考

    首先解释下我测试结果测试的原因,对于animator初步了解把下图红色框的过程当做了切换过程。所以我在刚触发A-B时就立即触发A-C,即Interruption没有效果, 后来恍然大悟后才理解原来只有黄色框的部分是状态切换的过程,即只有在黄色框的时间内改变状态,Interruption才有效。错误演示

    三、Unity功能意义思考

    理解了过渡时间后也想通了Interruption状态切换打断属性存在的意义:animator的每一个状态切换时间段都分了三部分:1、切换前 2、切换中 3、切换后 分别对应下图的红黄蓝区域
    红黄蓝图
    以下所有测试专用图
    1、切换前:举个栗子言之 触发A-B状态后,不管触发A-C还是A-D,都会切换状态,但是触发B-D或者C-D都不行,因为此时状态机执行的动画是A,所以无法切换

    2、切换后:触发A-B,在状态切换完成后,即时间处于蓝色区域,这时候状态机执行B动画,以后就可以由B切换到其他状态

    3、切换中:切换前和切换后期间都可以切换状态,那么问题来了,切换中可以吗,切换规则是什么呢,这就是Interruption的意义

    四、Interruption详解

    参考上文中推荐译文,测试时一定要注意打断状态的时间

    展开全文
  • 不要怕被打断

    2012-12-06 23:31:00
    我要说的是,你被打断之后,理所当然的高估自己的思考,而不是真实的思想质量。你以为你不被打断,必然就会解决问题,或者找到问题的核心?真的么?你有这种百分之一百的信心?这不过是错觉而已,一个...
  • 对程序员来说,打断是低效率...在某一个会议上,或者某一次会议之前的回顾过程中,对销售人员来说,一次中断的代价意味着他花在处理被打断上的时间。比如一次摇头,或者“我刚讲到哪儿了?噢,我想起来了。” 再比如一
  • 碎片粘合:Tasking DD 启发的思考

    千次阅读 2021-11-09 00:33:24
    标题原来意指 TDD,即 Test Driven Development,用 TDD 来进行碎片化时间的粘合。只是呢,Tasking 才是 TDD 的核心,于是在新的思考之下,我重构了本文...
  • 漫画:为什么不能打断程序员?

    千次阅读 2015-06-10 15:36:04
    漫画:为什么不能打断程序员? 2012年,国外程序员 Daniel Greenfeld 在 Twitter 发了一条推(见下图):“开发人员每天应当有 4-6 小时的无中断时间。每次 3-5 分钟的中断,其成本远超过你的想象。” ...
  • 关于在Struts2框架下JSON串被打断的问题
  • 谷歌SRE与运维工作的思考

    千次阅读 2020-02-04 08:51:00
    “工作经常被打断,技术含量不高的问题太多,开发换了一轮又一轮、重复性问题回答了一遍又一遍...”等等,也是运维人员经常抱怨最大的问题。 我们也老早安排了值班,但由于各个产品业务的独特性与复杂性,值班人员...
  • 今天我们不讲技术,给大家换换口味聊聊我个人对发掘业务痛点、个人成长以及未来发展的一些思考本文索引发掘业务痛点、个人成长和未来发展的关系如何发掘业务痛点业务压力大怎么兼顾个人成长如何训练自己...
  • 规划与思考

    千次阅读 多人点赞 2020-02-29 19:46:33
    规划与思考 写于: 2020年2月29日 从2018年实习到现在,也算干了一年多的程序员. 时间飞逝,技术和心态成长了很多.但是还是有很多地方需要提升的. 这里做了一个总结以及未来的规划. 时间管理 小的时候总觉得时间过得很...
  • 对功能测试的一些思考

    千次阅读 2022-04-13 11:00:58
    今天笔者就来聊聊自己对于功能测试的一些个人经验和思考。  接到需求后,我一般会将需要做的工作分为三部分,分别为:需求分析、测试用例、以及测试执行。当然,有一个很重要的大前提,那就是要足够熟悉你所测的...
  • 适合思考的环境

    2018-06-28 08:01:34
    适合思考的环境 适合思考的环境 生活中适合思考的场景 为什么这些地方适合思考??有什么共性?? 温度比较低的地方 有东西流动的地方 安静的地方 古典音乐 和不爱思考的人聊天 共性 生活中总有一些...
  • 关于提升工作效率的一点思考

    千次阅读 2018-11-26 22:41:23
    来自测试的打断:文档写详细,避免询问打断,将他人带到自己的工作习惯中,避免牵着走。 关于面子 需求沟通过程中,有疑问就要问,切记因为不好意思,而不沟通,需求的正确执行是第一要务,不懂就要...
  • “我们有很长时间的创新历史,” 在问到游戏业为何在瑞典如此活跃,Albiin 说,“我们的国民在 8、90 年代就拥有了不少家用电脑,孩子们很早就伴着个人电脑成长。而我们的文化也一直秉承着这样一个原则:找到...
  • 程序员坐牢了,会安排去写代码吗?

    千次阅读 多人点赞 2022-06-21 22:16:05
    本文字数较多,建议先收藏,上下班路上、带薪上厕所、浑水摸鱼再慢慢看~ 来源: https://www.zhihu.com/question/483752248/answer/2127520344 本故事纯属虚构 请大家不要随意模仿,后果自负! 因为删库跑路,...
  • 快速学习JS的思考方法、有用

    千次阅读 2016-10-20 15:54:10
    当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战:有些概念容易混淆,...幸运的是,这些挑战最终都可以战胜。在这篇文章里,我将介绍 6 个思维技巧来帮你更快的学习 JavaScript ,让你
  • 超硬核!操作系统学霸笔记,考试复习面试全靠它

    万次阅读 多人点赞 2021-03-22 18:43:49
    3)程序状态字(PSW​):含有状态信息,条件码,执行方式(指在系统还是用户状态下执行),中断屏蔽标志(允不允许在执行的过程中被打断) 4)用户栈指针:每个用户进程都有系统栈,用于存放过程和系统调用参数及...
  • 我自己一堆开发任务没做完,整天就是业务打断,导致一年了自己。最重要的是,做的事情完全不认可,业务只当你是工具人,老板也看不到你的业绩,自己也常常忘了还是程序员这件事,这工作就是谁干谁抑郁。想要解决...
  • 机器就不可以执行某些应当描述为思考,但是又非常不同于人所作的那种思考么(May not machines carry out something which ought to be described as thinking but which is very different from what a man does...
  • 可用性测试实施一般是使用发声思考,即用户在一个测试环境中给予任务,并鼓励他们在尝试完成任务出声思考。这能够帮助可用性测试的主试即实验者知道用户界面(APP设计)是如何帮助用户自然地思考和执行操作,...
  • 一线技术人的成长思考总结

    千次阅读 2022-04-19 09:54:00
    新增了部分数据模型,兄弟团队或者业务运营同学经常会丢一个单子过来让开发同学人工帮忙查单据状态、物流进度、单据关系等,这个造成了值班的开发同学编码时间经常被打断,效率下降,所以我们归纳推演了下分析问题的...
  • 都会遇到一个问题,管理者会紧急的打断下属之前的工作计划,让下属干管理者认为重要的工作。 二.问题举例 土老三,经过多年努力,终于当上了一个领导。他有若干个个下属,其中一个叫王老五的。 土老三,在2周前,给...
  • Js学习心得和思考方法

    千次阅读 2019-01-31 20:31:52
    当人们尝试学习 JavaScript , 或者其他编程技术的时候,常常会遇到同样的挑战: 有些概念容易混淆,特别是当你学习...幸运的是,这些挑战最终都可以战胜。在这篇文章里,我将介绍 6 个思维技巧来帮你更快的学习...
  • 在计划行进中不习惯被打断。 不容易分心。 系统型的个人风格。 有计划(合倾向) 无论是工作还是生活都常列出备忘List。 不习惯兴致突发去做什么事情。 以未来为重,提前规划。 提早启动(合...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,680
精华内容 8,672
热门标签
关键字:

思考时被打断