热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java,不要等待线程完成-Java,Don'twaitforathreadtocomplete

Ineedtofindawaytospinoffathreadfromastaticcallandnotwaitforthethreadtocomplete

I need to find a way to spin off a thread from a static call and not wait for the thread to complete. Basically, a "fire and forget" approach. Can someone supply me with a simple example of how this can be accomplished?

我需要找到一种从静态调用中分离线程的方法,而不是等待线程完成。基本上,一种“即发即忘”的方法。有人能为我提供一个如何实现这一目标的简单例子吗?

5 个解决方案

#1


Thread t = new Thread(new YourClassThatImplementsRunnable());
t.start();

// JDK 8
new Thread(() -> methodYouWantToRun()).start();

#2


If it's a long-lived thread that has a similar lifecycle to your app itself, and is going to be spending a lot of its time waiting on other threads:

如果它是一个长期存在的线程,它与你的应用程序本身具有相似的生命周期,并且将花费大量时间等待其他线程:

new Thread(new yourLongRunningProcessThatImplementsRunnable()).start();

If it's a short-lived, CPU-bound task:

如果它是一个短命的,受CPU限制的任务:

ExecutorService es = Executors.newFixedThreadPool(Runtime.availableProcessors());
es.submit(new yourTaskThatImplementsRunnable());

Though, in most cases like this, you will be submitting a number of tasks to that same ExecutorService.

但是,在大多数情况下,您将向同一个ExecutorService提交许多任务。

See:
  • Java Concurrency Tutorial
  • Java并发教程

  • ExecutorService
  • ExecutorCompletionService
  • Runnable
  • Thread
  • Future

#3


public static void foo() {
    new Thread() {
        public void run() {
                     //do something here....
        }
    }.start();
}

#4


Depending on the nature of your task, different ways may be approrpiate:

根据您的任务性质,可能会采用不同的方式:

(1) As many have mentioned, a common way for an occasional task is simply to construct a thread and call its start() method.

(1)正如许多人所提到的,偶然任务的一种常见方法是简单地构造一个线程并调用它的start()方法。

(2) Remember that if your background thread doesn't stop, then by default it will prevent your program from shutting down when other threads have finished. You may therefore want to call setDaemon(true) on the thread so that it doesn't have this behaviour. (In GUI-based applications, on the other hand, you usually end up just calling System.exit() anyway, and ideally you'd buile into your long-running task a clean way of shutting down.)

(2)请记住,如果后台线程没有停止,那么默认情况下它会阻止程序在其他线程完成时关闭。因此,您可能希望在线程上调用setDaemon(true),以便它不具有此行为。 (另一方面,在基于GUI的应用程序中,您通常最终只是调用System.exit(),理想情况下,您可以通过一种干净的关闭方式来运行长期运行的任务。)

(3) If you frequently have short-lived tasks to "fire and forget", then consider using the Executors framework available from Java 5 onwards.

(3)如果你经常有短暂的任务“发射并忘记”,那么考虑使用Java 5以后的Executors框架。

#5


basically start the thread and dont perform join. So you will not be waiting for the thread to finish.

基本上启动线程,不要执行连接。所以你不会等待线程完成。


推荐阅读
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • PHP-Casbin v3.20.0 已经发布,这是一个使用 PHP 语言开发的轻量级开源访问控制框架,支持多种访问控制模型,包括 ACL、RBAC 和 ABAC。新版本在性能上有了显著的提升。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 稀疏数组是一种用于存储和处理大部分元素为零或相同值的数组的技术。通过记录非零元素的位置和值,稀疏数组可以显著减少存储空间和提高处理效率。 ... [详细]
  • Java设计模式详解:解释器模式的应用与实现
    本文详细介绍了Java设计模式中的解释器模式,包括其定义、应用场景、优缺点以及具体的实现示例。通过音乐解释器的例子,帮助读者更好地理解和应用这一模式。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文介绍了Spring 2.0引入的TaskExecutor接口及其多种实现,包括同步和异步执行任务的方式。文章详细解释了如何在Spring应用中配置和使用这些线程池实现,以提高应用的性能和可管理性。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • JVM钩子函数的应用场景详解
    本文详细介绍了JVM钩子函数的多种应用场景,包括正常关闭、异常关闭和强制关闭。通过具体示例和代码演示,帮助读者更好地理解和应用这一机制。适合对Java编程和JVM有一定基础的开发者阅读。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 在HTML布局中,即使将 `top: 0%` 和 `left: 0%` 设置为元素的定位属性,浏览器中仍然会出现空白填充。这个问题通常与默认的浏览器样式、盒模型或父元素的定位方式有关。为了消除这些空白,可以考虑重置浏览器的默认样式,确保父元素的定位方式正确,并检查是否有其他CSS规则影响了元素的位置。 ... [详细]
author-avatar
棂魂買弄l
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有