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

多线程基础知识(全面):创建线程、线程状态如何变化、wait()、notify()、sleep()、停止线程

Callable接口实现类的对象将此对象传递到FutureTask构造器,创建FutureTask的对象将FutureTask的对象传递到Thread的构造器,创建Thread对象并调用start(...同时,Java也规定调用 notify() 也必须在synchronized代码块。并且,加锁的锁对象必须要与调用wait()的锁对象是同一个。...cpu,但你们还可以用)而 sleep 如果在 synchronized 代码块执行,并不会释放对象锁(放弃 cpu,你们也用不了)4.4 如何停止一个正在运行的线程通常情况下我们是不会去手动去停止的...,而是等待线程自然运行至结束停止,但是在我们实际开发,会有很多情况我们是需要提前去手动来停止线程,比如程序中出现异常错误,比如使用者关闭程序等情况。...此时需要用到 isInterrupted() 方法public boolean Thread.isInterrupted() //判断是否被中断如果希望线程在中断后停止,就应该先判断线程是否被中断,然后再执行中断处理代码

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

不会用Java Future,怀疑你泡茶没我快, 又是超长图文!!

二者都是函数式接口,里面都仅有一个方法,使用上又是如此相似,除了有无返回值,Runnable 与 Callable 就点差别?...整体差别虽然不大,但是这点差别,却具有重大意义 返回值和处理异常很好理解,另外,在实际工作,我们通常要使用线程池来管理线程(原因已经在 为什么要使用线程池?...,则执行中断处理 if (s >= INTERRUPTING) handlePossibleCancellationInterrupt(s); } }...是想说,使用 FutureTask 来演练烧水泡茶经典程序 ?...灵魂追问 你在日常开发工作是怎样将整块任务做到分工与协作的呢?有什么基本准则? 如何批量的执行异步任务呢? 参考 Java 并发编程实战 Java 并发编程的艺术 Java 并发编程之美

51730

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

仅从 isDone 源码那段 status != NEW 的代码,认为这个 Martin 老哥说的确实没有问题。因为确实有两个中间态,这段源码是没有考虑的。...觉得吧,Paul 说的挺有道理的,赞成他的建议。 ? 但是吧,也觉得我们在讨论的是一个非常细节,非常小的问题,不知道,就算现在这样写,会导致任何问题?...但是就在这时 Paul 同学杀了个回马枪,应该也是前面的讨论激发了他的思路,你不是说检测不出来,你不是说 get 方法可以获得最终的正确结果? 那你看看我这段代码是什么情况: ?...我们还是得对其进行了一个优先检查,告知程序当前线程是否发生了中断,即是否有继续往下执行的意义。 但是,在这个场景,当前线程中断了,但并不能表示 Future 里面的 task 任务的完成情况。...因为源码里面判断 COMPLETING 的操作在判断线程中断标识之前: ? 想就不需要再过多解释了吧。

64331

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

现在先回顾一下这篇文章抛出的问题和问题的答案: 一个线程池中的线程异常了,那么线程池会怎么处理这个线程? 这个题是遇到的一个真实的面试题,当时并没有回答的很好。...寻思这没毛病呀,这不是很正常?不就是应该这样输出? 那个哥们说:和你说的不一样啊,你说的是调用 future.get 方法的时候会抛出异常的?...回答到:你这不是把会抛出运行时异常的 sayHi 方法用 try/catch 代码块包裹起来了吗?异常在子线程里面就处理完了,也就不会封装到 Future 里面去了。...所以经过 FutureTask 的 run 方法后,如果任务没有被中断或者取消,则会通过 setException 或者 set 方法完成状态的流转和 outcome 参数的设置: ?...在循环体扔 10 个比较耗时的任务进去。有 3 个任务它处理不了,那么肯定是会触发拒绝策略的。 你觉得这个程序运行后会在控制台打印异常日志?会打印几次呢? 看一下运行结果: ?

1.1K10

Java线程知识点总结

interrupt 中断另一个线程的运行状态。 interrupted 测试当前线程是否已被中断。通过此方法可以清除线程的中断状态。...Thread.sleep 方法可能会抛出 InterruptedException,因为异常不能跨线程传播回 main ,因此必须在本地进行处理。线程抛出的其它异常也同样需要在本地进行处理。...; } } } } 参考阅读:Java 守护线程的总结 线程通信 当多个线程可以一起工作去解决某个问题时,如果某些部分必须在其它部分之前完成,那么就需要对线程进行协调...如果调用某个对象的 wait 方法,当前线程必须拥有这个对象的对象锁,因此调用 wait 方法必须在 synchronized 方法和 synchronized 代码块。...此状态意味着:线程已经在 JVM 运行。但是在操作系统层面,它可能处于运行状态,也可能等待资源调度(例如处理器资源),资源调度完成就进入运行状态。

27020

【原创】Java并发编程系列2:线程概念与基础操作

Thread类中有一个join方法就可以用来处理这种场景。...调用某个对象的wait()方法和notify()方法,当前线程必须拥有这个对象的monitor,因此调用wait()方法和notify()方法必须在同步块或者同步方法中进行(synchronized块或者...线程中断 Java的线程中断是一种线程间的协作模式。每个线程对象里都有一个boolean类型的标识(通过isInterrupted()方法返回),代表着是否有中断请求(interrupt()方法)。...例如,当线程t1想中断线程t2,只需要在线程t1将线程t2对象的中断标识置为true,然后线程2可以选择在合适的时候处理中断请求,甚至可以不理会该请求,就像这个线程没有被中断一样。...在上面章节也讲到了线程中断的一些内容,此处就不再用代码来展开了。 Java并发编程大纲 继续附上Java编程的系统学习大纲以供参考: Java并发编程.png ?

38010

Java面试手册:线程专题 ①

线程是操作系统能够进行运算的最小单位,他包含在实际的运作单位里面,是进程的实际运作单位。 程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。...在JVM,像垃圾收集器线程就是守护线程。 守护线程必须在用户线程执行前调用,它是一个后台服务线程,一个守护线程创建的子线程依然是守护线程。 19、如何创建守护线程?...==当run()或者call()方法执行完的时候线程会自动结束,如果要手动结束一个线程,可以用volatile布尔变量来退出run()方法的循环或者是取消任务来中断线程。...更喜欢jcmd命令(jdk1.8以上)。 23、什么是FutureTask? 在Java并发程序FutureTask表示一个可以取消的异步运算。...一个FutureTask对象可以对调用了Callable和Runnable的对象进行包装,由于FutureTask也是调用了Runnable接口所以它可以提交给Executor来执行。

78920

Java异步编程——深入源码分析FutureTask

之前通过源码详细分析了ThreadPoolExecutor《你真的懂ThreadPoolExecutor线程池技术?看了源码你会有全新的认识》。...原来接口只接收Callable参数,实现类还新增了接收Runnable参数的。 如果看过之前写的《你真的懂ThreadPoolExecutor线程池技术?...到这里我们清楚知道了,submit()方法重点是利用Callable/Runnable创建一个FutureTask,然后多线程执行run()方法,达到异步处理并且得到结果的效果。...在自旋的for()循环中, 先判断是否线程被中断中断的话抛异常退出。 然后开始判断运行的state值,如果state大于COMPLETING,证明计算已经是终态了,此时返回终态变量。...submit()的原理是利用Callable创建一个FutureTask对象,然后执行对象的run()方法,把结果保存在outcome

58330

Java 多线程系列Ⅰ

需要注意一件事: FutureTask的get方法获取返回值只能执行一次 而且,如果使用了这个方法但是线程还没有运行到可以返回的那行代码,那么就会一直阻塞...比如如果在这里执行了如下代码: Object result=futureTask.get(); 那么就永远阻塞了 当然,更想说的是,...wait 方法必须在 synchronized 保护的代码中使用,而 sleep 方法并没有这个要求。 wait 方法会主动释放锁,在同步代码执行 sleep 方法时,并不会释放锁。...wait 方法意味着永久等待,直到被中断或被唤醒才能恢复,不会主动恢复,sleep 方法中会定义一个时间,时间到期后会主动恢复。...当sleep状态超时、join等待线程终止或者超时、或者l/O处理完毕时,线程重新转入就绪状态。

15410

Java并发—Java线程

Java线程面试题 0.1 线程占用的内存 JDK1.4默认单个线程占用256K JDK1.5默认单个线程占用1M 可以通过-Xss参数设定 0.2 为什么要使用线程池 手动创建线程池的缺点 不受风险控制...线程中断 可以理解为Thread有个interrupted标识符,默认为false,表示一个线程是否被其他线程进行了中断操作 public void interrupt();//将Thread的表示符设为...RUNNING状态变为READY状态,不会释放锁,但会释放CPU资源 wait(),notify(),nitifyAll() 使用wait(),notify(),nitofyAll()时需要对调用对象加锁(必须在同步代码块内...4.3 等待/通知规范 等待方伪代码 synchronized(对象){ while(条件不满足){ 对象.wait(); } 对应的处理逻辑 } 通知方伪代码 synchronized...FutureTask(可以由调用线程执行其run(),也可以作为任务提交给线程池) 5. 定时器 6. Stream的parallelStream 7. 线程池隐性创建

2K21

【Android 异步操作】FutureTask 分析 ( Future 接口解析 | Runnable 接口解析 | Callable 接口解析 )

模拟 AsyncTask 执行过程 | AsyncTask 执行过程回顾 | FutureTask 分析 ) , 使用 FutureTask 模拟 AsyncTask 执行 , 简单介绍了 FutureTask... 类 , 和 RunnableFuture 接口 ; 本篇博客将分析 Future 接口 , 和 Runnable 接口 , 以及 FutureTask 的运行机制 ; 相关参考文档 : FutureTask..., 该任务之后也不会被执行 ; * 如果任务已经开始执行 , mayInterruptIfRunning 参数确定 , 在尝试终止任务时 , * 该执行任务的线程 , 是否应该被中断...提供一个通用协议 ; 如 : Thread 类实现了 Runnable 方法 ; 活动状态 : 处于活动状态的含义是 , 线程已经被开始了 , 还不能被停止 , 如果想要执行代码 , 必须在其它线程执行...并且这些对象想要执行代码 , 提供一个通用协议 ; * 如 : Thread 类实现了 Runnable 方法 ; * 处于活动状态的含义是 , 线程已经被开始了 , 还不能被停止 , 如果想要执行代码 , 必须在其它线程执行

2K00

CallableFuture 使用及原理分析,Future .get()为啥能等待呢?

这个在很多地方有用到,比如 Dubbo 的异步调用,比如消息中间件的异步通信等等… 利用 FutureTask、 Callable、 Thread 对耗时任务(如查询数据库)做预处理,在需要计算结果之前就启动计算...= 4; // FutureTask 任务完结,也是取消任务,不过发起了中断运行任务线程的中断请求 private static final int INTERRUPTING = 5; // FutureTask...任务完结,也是取消任务,已经完成了中断运行任务线程的中断请求 private static final int INTERRUPTED = 6; run 方法 public void run()...// 节点是否已添加 for (;;) { // 如果当前线程中断标志位是 true, // 那么从列表移除节点 q,并抛出 InterruptedException...表示 call 的返回值 if (s == NORMAL) // 表示正常完结状态,所以返回结果值 return (V)x; // 大于或等于 CANCELLED,都表示手动取消

4.3K20

Java并发——一文吃透线程池

(包括线程正在执行的和处于阻塞队列的) STOP(停止)——不再接收新的任务,不会处理阻塞队列的额任务,并且会中断正在执行的任务 TIDYING(整理)——所有的任务都已经终止,将线程池状态转换为TIDYING...已经执行完毕terminated(),线程池终止 线程池维护了一个AtomicInteger变量来表示线程池所处的状态(该变量还可以表示线程池中的线程数) 线程池状态变化 线程池状态变化.png 3.2 手动创建线程池...CallerRunsPolicy:由提交任务的线程处理任务 DiscardOldestPolicy:丢弃队列中最老的任务,重新提交这个被拒绝的任务 DiscardPolicy:不处理,丢弃掉。...而不是直接把线程数目拉到最大 的个人理解 认为线程池的本意是让核心数量的线程工作着,任务队列起到一个缓冲的作用,最大线程数目这个参数更像是无奈之举,在任务非常多的情况下做最后的努力,去新建线程来帮助处理任务...FutureTask FutureTask可以由调用线程直接执行(FutureTask.run())(这种方式不会创建新的线程),也可以提交给线程池执行 FutureTask跟Future一样,可以控制任务的执行状态

32600

Java 异步编程实战之基于 JDK 的 Future 实现异步编程|送书

一、前言 本节主要讲解如何使用JDK的Future实现异步编程,这包含如何使用FutureTask实现异步编程以及其内部实现原理以及FutureTask的局限性。...方法;FutureTask的任务可以是Callable类型,也可以是Runnable类型(因为FutureTask实现了Runnable接口),FutureTask类型的任务可以被提交到线程池执行。...异常;如果在等待结果的过程中有线程中断了该线程,则抛出InterruptedException异常;如果任务计算过程抛出了异常,则会抛出ExecutionException异常。...可以通过编程的方式手动设置(代码的方式)Future的结果;FutureTask则不可以让用户通过函数来设置其计算结果,而是其任务内部来进行设置。...、Web请求的异步处理、以及常见的异步编程框架原理解析和golang语言内置的异步编程能力。

1.7K10
领券