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

为什么不推荐使用 stop、suspend 方法中断线程?

我们知道像stop、suspend这几种中断或者阻塞线程的方法在较高java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java的历史舞台而又渐渐的推出了舞台呢?...那么不建议使用stop中断线程我们应该怎么去优雅的结束一个线程呢,我们可以存java开发者的注释中窥探到一种解决方案: Many uses of stop should be replaced by code...可以看到调用interrupt方法后并不会像stop那样暴力的中断线程,会等到当前运行的逻辑结束后再检查是否中断,非常的优雅。 注:运行举例代码可能不会打印出数字,这是因为t1线程运行到while(!...Thread.currentThread().isInterrupted())时,主线程已经调了interrupt方法,因此多次运行可能会打印出数字。...二、suspend的落幕 suspend方法的作用是挂起某个线程直到调用resume方法来恢复该线程,但是调用了suspend方法后并不会释放被挂起线程获取到的锁,正因如此就给suspend和resume

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

    为什么不推荐使用 stop、suspend 方法中断线程?

    java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java的历史舞台而又渐渐的推出了舞台呢?...那么不建议使用stop中断线程我们应该怎么去优雅的结束一个线程呢,我们可以存java开发者的注释中窥探到一种解决方案: Many uses of stop should be replaced by code...可以看到调用interrupt方法后并不会像stop那样暴力的中断线程,会等到当前运行的逻辑结束后再检查是否中断,非常的优雅。 注:运行举例代码可能不会打印出数字,这是因为t1线程运行到while(!...Thread.currentThread().isInterrupted())时,主线程已经调了interrupt方法,因此多次运行可能会打印出数字。...二、suspend的落幕 suspend方法的作用是挂起某个线程直到调用resume方法来恢复该线程,但是调用了suspend方法后并不会释放被挂起线程获取到的锁,正因如此就给suspend和resume

    54420

    第48问:为什么 MySQL 运行时, 不鼓励调整系统时间

    问 在 MySQL 运行时,我们调整系统时间,会造成什么影响么?...我们来查看输出: 我们将两个时间戳相减,算出这个锁持续了多久: 5375908 - 5375891 = 17 秒 由此我们知道:调整系统时间,会影响 MDL 的等待时间的计算 小贴士 此处我们获取系统时间的方法有点奇怪...单调时钟不会受到系统时间变化的影响,/proc/timer_list 中的输出就是单调时钟的一种 除了以上的实验,调整系统时间,对正在运行的 MySQL 还会有其他影响,比如说半同步的等待时间计算、延时复制的延时时间计算等等...我们不建议在 MySQL 运行时调整系统时间,如需调整,应及时重启 MySQL 。

    82910

    剖析灵魂,为什么aiohttp默认的写法那么慢?

    ,而不需要像昨天那样先创建一个事件循环再运行。...运行效果如下图所示: ? 可以看到,运行时间大于 8 秒钟,也就是说,这段代码,是先请求第一个 3 秒的网址,等它运行完成以后,再请求第二个 5 秒的网址,他们根本就没有并行!...那为什么上面这段代码,并没有按这段逻辑来走? 这是因为,协程虽然可以充分利用网络 IO 的等待时间,但它并不会自动这么做。而是需要你把它加入到调度器里面。...运行效果如下图所示: ?...那么为什么我们把很多协程放进一个 列表里面,然后把列表放进 asyncio.wait里面,也能实现并行呢?这是因为,asyncio.wait帮我们做了创建 Task 的任务。

    1.8K10

    python基础教程:异步IO 之编程例子

    (3)通过 asyncio.create_task() 函数并发运行作为 asyncio 任务(Task) 的多个协程。...当一个协程通过 asyncio.create_task() 被打包为一个 任务,该协程将自动加入程序调度日程准备立即运行。 create_task()的基本使用前面例子已经讲过。...这是因为,main()不sleep或sleep少于1秒钟,main()就在whattime()还未来得及打印结果(因为,它要sleep 1秒)就退出了,从而整个程序也退出了,就没有whattime()的输出结果...如果main()协程只sleep了0.1秒,它就先醒了,给事件循环发消息,事件循环就来继续执行main()协程,而main()后面已经没有代码,就退出该协程,退出它也就意味着整个程序退出,4个任务就没机会打印结果...这是为什么呢? 我猜想是这样的:4个任务生成在前,第18行的sleep在后,事件循环的消息响应可能有个先进先出的顺序。后面深入asyncio的代码专门研究一下这个猜想正确与否。

    79720

    Python中的异步编程:深入理解和使用asyncio库

    协程是一种比线程更轻量级的存在,协程的调度完全由用户控制,协程之间的切换不涉及系统调用,开销极小。Python 中的协程并不是线程安全的,它们应该运行在同一个线程中。...你也可以使用 asyncio.create_task() 来创建一个任务,然后使用 asyncio.run() 来运行这个任务。此外,你还可以使用 asyncio 的事件循环功能。...你可以使用 asyncio.get_event_loop() 来获取当前的事件循环,然后使用事件循环的 run_until_complete() 方法来运行一个任务,或者使用事件循环的 run_forever...() 方法来持续运行事件循环。...task2 = asyncio.create_task(do_something_cost_time(\"WatchTV\", 5)) task3 = asyncio.create_task(do_something_cost_time

    6.6K10

    Python 异步协程:从 asyncawait 到 asyncio 再到 async with

    () 将协程包装成一个任务,该任务会被事件循环调度执行asyncio.gather() 并发运行多个任务,并等待它们全部完成asyncio.run() 创建事件循环,运行 main() 协程,直到它完成使用...一个类要支持异步上下文管理,需要实现 __aenter__ 和 __aexit__ 方法:import asyncioimport randomclass AsyncResource: async...randomasync def long_operation(name): try: print(f"{name} 开始执行") while True: # 模拟一个持续运行的操作...(long_operation("任务1")) task2 = asyncio.create_task(long_operation("任务2")) task3 = asyncio.create_task...任务2 被取消了任务3 被取消了这个例子展示了如何正确处理任务取消:任务可以在执行过程中被取消被取消的任务会抛出 CancelledError我们应该适当处理取消信号,确保资源被正确清理深入理解协程:为什么需要

    7500

    Python 异步: 创建和运行异步任务(7)

    高级 API可以使用 asyncio.create_task() 函数创建任务。...asyncio.create_task() 函数接受一个协程实例和一个可选的任务名称,并返回一个 asyncio.Task 实例。......返回一个任务实例任务实例可以被丢弃,通过方法与之交互,并由协程等待。这是从 asyncio 程序中的协程创建任务的首选方法。2.2....然后可以使用它来调用 create_task() 方法来创建一个 Task 实例并安排它执行。......任务何时运行?创建任务后的一个常见问题是它什么时候运行?虽然我们可以通过 create_task() 函数调度协程作为任务独立运行,但它可能不会立即运行。事实上,直到事件循环有机会运行,任务才会执行。

    1.8K00

    Python 异步: 保护任务免于取消(13)

    ” Asyncio 任务可以通过调用它们的 cancel() 方法来取消。我们可以通过将任务包装在对 asyncio.shield() 的调用中来保护任务不被取消。 让我们仔细看看。 1....shielded = asyncio.shield(task) # await the shielded task await shielded 返回的 Future 可以通过调用 cancel() 方法取消...如果内部任务正在运行,请求将被报告为成功。...然后该任务就不会被取消。 然后将屏蔽的任务传递给 cancel_task() 协程,该协程包装在任务中并进行调度。主协程然后等待受保护的任务,该任务需要 CancelledError 异常。...任务运行片刻然后休眠。取消任务运行片刻,休眠,恢复然后取消屏蔽任务。取消请求报告它已成功。 这会在受保护的 Future 中引发 CancelledError 异常,但不会在内部任务中引发。

    1.1K20

    运筹帷幄决胜千里,Python3.10原生协程asyncio工业级真实协程异步消费任务调度实践 (转载非原创)

    Eventloop可以将一些异步方法绑定到事件循环上,事件循环会循环执行这些方法,但是和多线程一样,同时只能执行一个方法,因为协程也是单线程执行。...当执行到某个方法时,如果它遇到了阻塞,事件循环会暂停它的执行去执行其他的方法,与此同时为这个方法注册一个回调事件,当某个方法从阻塞中恢复,下次轮询到它的时候将会继续执行,亦或者,当没有轮询到它,它提前从阻塞中恢复...但事实上,Python3.10也支持“同步写法”的协程方法:async def create_task(): task1 = asyncio.create_task(job1())...task2 = asyncio.create_task(job2()) await task1 await task2这里我们通过asyncio.create_task对job1和job2...这也解释了为什么相似场景中多线程的出场率要远远高于协程,就是因为多线程不需要考虑启动后的“切换”问题,无为而为,简单粗暴。

    50350

    asyncio 使用总结

    这种方式允许所有任务几乎同时开始,并且它们各自独立地运行,无需等待其他任务完成。这显著提高了程序的并发性能。 这两种方法展示了如何根据不同的需求选择合适的任务调度策略。...如果不指定,默认使用 asyncio.get_event_loop()。 limit: 可选参数,设置缓冲区的大小限制,默认为 256 KB。...Exception as e: print(f"Error: {e}") finally: print('server exit') # 这个方法用于关闭...StreamWriter 对象的底层传输(例如 TCP 连接) # 调用 close() 后,传输会停止发送数据,并尽可能地完成剩余数据的发送 # 然而,这个方法本身是非阻塞的...,即它会立即返回,而不等待连接完全关闭 writer.close() # 关闭连接 # 这个方法是异步的,它等待直到底层的传输真正关闭 # 这意味着在这个

    39275
    领券