首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于多线程中抛异常这个面试题我再说最后一次!

现在先回顾一下这篇文章抛出的问题和问题的答案: 一个线程池中的线程异常了,那么线程池会怎么处理这个线程? 这个题是我遇到的一个真实的面试题,当时并没有回答的很好。...然后一个读者找我聊天,说为什么他这样写,通过 future.get 方法没有抛出异常呢,和我文章里面说的不一样呢? 我说:那肯定是你操作不对,你把代码发给我看看。 ?...那你的这个面试题是有问题的啊,描述不清楚,正确的描述应该是一个线程池中的线程抛出了未经捕获的运行时异常,那么线程池会怎么处理这个线程? 看到他的这个回复的时候,我竟然鼓起掌来,这届读者真是太严格了!...为什么当 submit 方法提交任务的时候,子线程捕获了异常,future.get 方法就不抛出异常了呢? 其实听到这个问题的时候都把我干懵了。 这问法,难道你是想再抛一次异常出来?...终极答案 上面说这个例子,其实我就是想引出终极答案。 终极答案就是:dispatchUncaughtException 方法。 为什么这样说呢? 我们现在把情况分为三种。

1.1K10

【推荐】C#线程篇---Task(任务)和线程池不得不说的秘密(5.1)

现在我要说的是,用线程池不是调用ThreadPool的QueueUserWorkItem方法,而是用任务来做相同的事: static void Main(string[] args) {...,不过有一条要注意:AttachedToParent标志,它总会得到Task采纳,因为它和TaskScheduler本身无关。   ...但是,我的结果为什么是t.Result而不直接是返回的Sum呢? 有没有多此一举的感觉?...就说上面的程序执行,因为累加数字太大,它抛出算术运算溢出错误,在一个计算限制任务抛出一个未处理的异常时,这个异常会被“包含”不并存储到一个集合中,而线程线程是允许返回到线程池中的,在调用Wait方法或者...你的代码就永远注意不到这个异常的发生,如果不能捕捉到这个异常,垃圾回收时,抛出AggregateException,进程就会立即终止,这就是“牵一发动全身”,莫名其妙程序就自己关掉了,谁也不知道这是什么情况

1.4K50
您找到你想要的搜索结果了吗?
是的
没有找到

如何解决C#异常:必须先将当前线程设置为单线程单元(STA)模式,然后才能进行OLE调用,请确保你的Main函数已在其上标记了STAThreadAttribute

本文概述 异常示例 解 如果你的应用程序运行一段代码, 该代码触发以下ThreadStateException异常: System.Threading.ThreadStateException:’必须先将当前线程设置为单线程单元...确保你的Main函数上已标记STAThreadAttribute。仅当将调试器附加到进程时, 才会引发此异常。 在本文中, 我们将向你简要说明如何防止此异常出现在WinForms项目中。...MyApplication { class WindowsTools { // Declare a local instance of chromium and the main...form in order to execute things from here in the main thread private static ChromiumWebBrowser...在我们的例子中, 使用从CefSharp中注册的类启动OpenFileDialog的方法, 如果在不更改线程的单元状态的情况下运行代码, 将引发异常

2.2K10

怎样处理InterruptedException

Java 中的受检查异常 InterruptedException 如何处理是令人头痛的问题,下面是我对处理这个问题的理解。...我会尽可能简单地描述这个问题。 我们从这段代码开始: ? 它做了什么?什么都没做,只是无止境的消耗 CPU。我们能终止它吗?在 Java 中是不行的。...准确地说,我会忽略他们对 interrupt() 方法的调用。虽然它们会要求终止线程,但是我会忽略它们。它们不能让线程中断。...这就是为什么 InterruptedException 是受检查异常。这种设计告诉你,如果你想在几毫秒内停止线程,确定你已经做好中断准备。实践中一般做如下处理: ?...上层可能捕获了运行时异常,所以这个线程还是存活的。线程所有者将会非常失望。 我们必须通知上层捕获了一个中断请求。我们不能只抛出运行时异常,这种行为太不负责了。

3.2K30

线程操作类

从结果可以看出,线程结束后的两句打印函数没有被执行 认识一下线程的状态: State是枚举类型,使用这个类可以得到所有状态,要注意的是并不是得到某个线程对象的状态,想要得到某个线程的状态要使用那个线程对象调用...从代码的运行结果来看,有人可能会疑惑为什么main方法里的打印函数明明在最后一句,为什么会先执行?...还有一点就是:调用sleep方法线程进入睡眠状态后,如果这个线程被强制激活、叫醒了,就会抛出异常。...这个说法说起来有点绕口,换个比喻就是:例如main是一个线程,在main里开启了一个A线程,那么main就是主线程A就是子线程。...true就代表这是个守护型线程,要注意的是这个方法一定要在start方法之前调用,在start方法之后调用是会抛异常的,因为你得在线程启动前声明这是个守护型线程

68410

Android多线程编程——线程基础

进程与线程 什么是进程? 什么是线程为什么要使用多线程?...线程是操作系统调度的最小单元,也叫轻量级进程。在一个进程中可以创建多个线程,这些线程都拥有各自的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量。 为什么要使用多线程?...Callable 可以在任务接受后提供一个返回值,Runnable无法提供这个功能。 Callable 中的call方法可以抛出异常,而Runnable的fun方法不能抛出异常。...由于线程属于异步计算模型,因此无法从别的线程得到函数的返回值,在这种情况下就可以使用 Future 来监视目标线程调用 call 方法的情况。...更好的做法就是,不适用try来捕获这样的异常,让方法直接抛出,这样调用者可以捕获这个异常,如下 class TestCallable extends Thread { @Override

33630

线程基础必知必会(二)

在大多数的时间内,这个线程什么也不做,而其他线程则执行它们的任务。一旦有信息输入,这个线程就立即获得比其他线程更高的优先级,在短时间内处理输入的信息。...但是第二个线程也获取到了 count 值值也是2,接着第一个线程执行了减操作,此时得到的值是1,然后第二个线程也同样进行了减操作,此时的值依然是1,也就是说我们只执行了一次减法操作,两次加法操作。...,需要等到这个对象解锁后才能进行下一步操作,但是这会出现严重的性能问题和死锁的问题,性能问题相关的解决方式我会在后面的文章讲解,这一小节主要是讲解死锁的解决方案。...六、线程异常处理 线程也是代码,因此也会出现异常,大部分开发人员的习惯是直接向上抛出异常,这种做法在普通的代码中并不错,向上抛出异常让方法的调用方去处理这个异常,但是在线程中这种做法就是错误的,因为抛出的异常无法在线程之外被检测的...六、线程异常处理 线程也是代码,因此也会出现异常,大部分开发人员的习惯是直接向上抛出异常,这种做法在普通的代码中并不错,向上抛出异常让方法的调用方去处理这个异常,但是在线程中这种做法就是错误的,因为抛出的异常无法在线程之外被检测的

28710

聊一聊未捕获异常与进程退出的关联

线程中的未捕获异常 我们使用下面的代码,模拟一个在子线程中出现未捕获异常的场景。...主线程不受刚刚异常的影响(进程还存在),在睡眠10秒后,会打印出所有线程的信息(不包含刚刚崩溃线程Thread-0的信息) //异常发生 输出线程名称和发生异常的时间 startErrorThread...回答:哈哈,这个问题是一个好问题,想要回答这个问题,就需要了解JVM如何处理未捕获异常的。这也是我们之前文章JVM 如何处理未捕获异常介绍的。...所以出现未捕获的异常,默认就会走到了Android系统默认设置的所有线程共用的处理者。 如果发生在主线程中呢 前面说的都是子线程,那么如果主线程出现未捕获异常,进程应该会退出吧。...那么这是为什么呢,看过我之前文章JVM 中的守护线程的朋友应该了解 JVM退出通常有两种情况 有效的调用System.exit() 所有的非守护线程退出后,JVM就会自动退出 因此不难得出结论 第一段代码中

1.3K10

Java程序员的经典错误,请注意

这是因为使用==编译器会得到封装类型对应的基本数据类型longValue,然后与这个基本数据类型进行比较,相当于编译器会自动将常量转换为比较基本数据类型, 而不是包装类型。...因为使用了线程池,线程是可以复用的,所以在使用ThreadLocal获取用户信息的时候,很可能会误获取到别人的信息。您可以使用会话来解决这个问题。 4....()->{ //do something double result = 10/0; }); 上面的代码模拟了一个线程池抛出异常的场景。...但是如果没有特殊处理,这个异常就会被线程池吃掉。这样就会导出出现问题你都不知道,这是很严重的后果。因此,最好在线程池中try catch捕获异常。...为什么我抓不到baidu的数据包? 我是后端,要学前端嘛? 好好的系统,为什么要分库分表?

29930

Flutter--Dart基础语法(四)异步

阻塞式调用: 调用结果返回之前,当前线程会被挂起,调用线程只有在得到调用结果之后才会继续执行。 非阻塞式调用: 调用执行之后,当前线程不会停止执行,只需要过一段时间来检查一下有没有结果返回即可。...这时,我们可能有两个问题: 问题一: 如果在多核CPU中,单线程是不是就没有充分利用CPU呢?这个问题,我会放在后面来讲解。 问题二: 单线程是如何来处理网络通信、IO操作它们返回的结果呢?...main function start Instance of 'Future' main function end 获取Future得到的结果 有了Future之后,如何去获取请求到的结果...3s后执行下面的代码 network data 执行中出现异常 如果调用过程中出现了异常,拿不到结果,如何获取到异常的信息呢?...我们已经知道Dart是单线程的,这个线程有自己可以访问的内存空间以及需要运行的事件循环; 我们可以将这个空间系统称之为是一个Isolate; 比如Flutter中就有一个Root Isolate,负责运行

1.4K20

记一次线程池引发的故障 排查下来是三歪的锅

,于是马上想到,之前那条 WAIT 状态的线程可能是因为同样的抛错所以被中断了,导致任务没有继续进行下去。 为什么说幸运?因为如果单线程的任务没有抛错的话,我可能很久都想不到是这个原因。...深入探究线程池的异常处理 工作上的问题到这里就找到原因了,之后的解决过程也十分简单,这里就不提了。 但是疑问又来了,为什么使用线程池的时候,线程异常被中断却没有抛出任何信息呢?...还有平时如果是在 main 函数里面的异常也会被抛出来,而不是像线程池这样被吞掉。 如果子线程抛出了异常线程池会如何进行处理呢?...,然后在setException(ex); 方法中,抛出的异常会被放到 outcome 对象中,这个对象就是 submit() 方法会返回的 FutureTask 对象执行 get() 方法得到的结果。...后续 在修复了单个线程任务的异常之后,我继续使用线程池进行重新统计业务,终于跑完了,也终于完成了这个任务。

87740

Doug Lea在J.U.C包里面写的BUG又被网友发现了。

这个 BUG 的作者 Martin 老哥是这样描述的: ? 下面我会给大家翻译一下他要表达的东西。 但是在翻译之前,我得先做好背景铺垫,以免有的朋友看了后一脸懵逼。...因为 COMPLETING 这个转瞬即逝的过渡状态是不会被程序给检测到的。 David 靓仔的回答在两个半小时候得到了大佬的肯定: ?...标号为 ③ 的地方是先中断当前线程,然后调用 get 方法获取任务结果。 标号为 ④ 的地方是如果 get 方法抛出了 IE 异常,则在这里进行记录,打印日志。...awaitDone 方法的入口处,就先检查了当前线程是否被中断,如果被中断了,那么抛出 IE 异常: ? 而代码怎么样才能执行到 awaitDone 方法呢? ?...最简单的解决方案就是先检查状态,再检查当前线程是否中断。 然后,这个 BUG 由 Martin 同学进行了修复: ? 修复的代码可以先不看,下面一小节我会给大家做个对比。

64131

调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真的停止线程

500000; i++) { System.out.println("i=" + (i + 1)); } } } public class Run { public static void main...应用程序并不会退出,启动的线程没有因为调用interrupt而终止,可是从调用isInterrupted方法返回的结果可以清楚地知道该线程已经中断了。那为什么会出现这种情况呢?...在Thread类中还有一个测试中断状态的方法(静态的)interrupted,换用这个方法测试,得到的结果是一样的。实际上,在JAVA API文档中对该方法进行了详细的说明。...这个时候,我们可以通过捕获InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。...这时候处理方法一样,只是捕获的异常不一样而已。

56500

线程状态之间的转换

stop() 停止一个线程,有可能抛出 ThreadDeath 异常。释放所占有的所有锁。这样会导致无法预测的异常发生。为什么?...因为如果这个线程正在持有一个对象的锁,进行同步代码块的执行,如果突然结束线程,锁住的代码块会立刻解锁,会导致无法预测的结果。...start() 启动一个线程 interrpet() 中断一个线程,被中断的线程会抛出 InterruptedException 异常。...其实实现中断依靠是一个状态位,通过去轮询判断这个状态位来响应中断 wait()、sleep() 等阻塞方法一般都有一个检查型异常 InterruptedException。...补充 接下来我会写一篇从操作系统角度来理解线程是怎么工作的文章来帮助大家理解线程之间的状态转换。

1.1K30

C#中的委托和事件 - Part.2

本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器、异常处理、超时处理和异步方法调用等内容。 为什么要使用事件而不是委托变量?...委托和方法的异步调用 通常情况下,如果需要异步执行一个耗时的操作,我们会新起一个线程,然后让这个线程去执行代码。...Thread.CurrentThread.Name,通过这个属性可以设置、获取执行当前代码的线程的名称,值得注意的是这个属性只可以设置一次,如果设置两次,会抛出异常。...Main Thread,而是来自线程池中的线程Pool Thread。...总结 这篇文章是对我之前写的C#中的委托和事件的一个补充,大致分为了三个部分,第一部分讲述了几个容易让人产生困惑的问题:为什么使用事件而不是委托变量,为什么通常委托的定义都返回void;第二部分讲述了如何处理异常和超时

2K20

一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考

receiveTime, DateUtil.YYYYMMDDHH24MISS).getTime() + "000"; 这行代码的意思是,将字符串的接收时间receiveTime格式化,getTime()得到时间戳...我是断点到这一步,发现下一行代码没有执行,我就断定问题是在这里,而且空指针异常一下子就能看出来了。问题来了,为什么没有打印异常信息呢?...我想应该是线程的问题,代码里启动这个写日志的定时任务用的是ScheduledExecutorService: 我Google了一下,发现其实有很多前辈都曾遇到过这个问题。...,异常堆栈:" + ex.getStackTrace()); } } } 这个解决方法打印了异常信息,但是并没有阻止线程挂掉。...启动的Java线程无故挂掉的原因是:如果使用者抛出异常,ScheduledExecutorService 将会停止线程的运行,而且不会报错,没有任何提示信息。

65810

使用引用

**场景二:传递一个值到一个函数中获取新的值** 基本和数组遍历一致,我们只需要声明这个函数的这个参数为引用即可,如下: “` function decorate(&$arr = []) {    ...我通常会像下面这么写,为什么?因为我认为在这种上下文的环境中format和doSomething的一个子集。... ** 细心的你可能会发现上面这种情况,可能绝大多数else代码里都是在处理异常情况,更有可能这个异常代码特别简单,通常我会这么去做: “` // 如果是在一个函数里面我会先处理异常的情况,然后提前return...(…) {         // 异常情况         return …;     }     // 正常逻辑     … } // 同样,如果是在一个类里面我会先处理异常的情况,然后先抛出异常...function doSomething(…)     {         …     } } “` ### 控制器拒绝直接的DB操作 最后我想说的是永远拒绝在你的Controller里直接操作DB,为什么

26740
领券