当前位置: 首页 > 面试题库 >

如何实现真正的异步Java线程

锺高翰
2023-03-14
问题内容

我有一个需要执行两项操作的功能,一项功能完成得很快,而一项则需要很长时间才能运行。我希望能够将长时间运行的操作委派给线程,并且我不在乎线程何时完成,但是线程需要完成。我实现了如下所示的方法,但是由于函数在start()调用后退出,因此我的第二个操作从未完成。如何确保函数返回但第二个操作线程也完成其执行并且不依赖于父线程?

public void someFunction(String data)
{
   smallOperation()
   SecondOperation a = new SecondOperation();
   Thread th = new Thread(a);
   th.Start();
}

class SecondOperation implements Runnable
{
  public void run(){
  // doSomething long running
 }
}

问题答案:
public void someFunction(final String data) {
    shortOperation(data);
    new Thread(new Runnable() {
        public void run(){
            longOperation(data);
        }
    }).start();
}

如果someFunction调用了longOperationif ,则JVM将运行if

  1. 运行它的线程未标记为 守护程序 (在上面的代码中没有)
  2. longOperation()不抛出一个异常
  3. 没有调用System.exit()longOperation()


 类似资料:
  • 我正在使用Kafka客户端1.0.0库中的KafkaProducer,根据文档,该方法是

  • 本文向大家介绍C# 中如何实现线程同步?相关面试题,主要包含被问及C# 中如何实现线程同步?时的应答技巧和注意事项,需要的朋友参考一下 (1)方法一:阻塞(调用Sleep()或Join()) (2)方法二:加互斥锁lock (3)方法三:信号和句柄(AutoResetEvent/ManualResetEvent,调用Set()和WaitOne())    

  • 问: 如何异步处理繁重的业务,避免主业务被长时间阻塞。例如我要给1000用户发送邮件,这个过程很慢,可能要阻塞数秒,这个过程中因为主流程被阻塞,会影响后续的请求,如何将这样的繁重任务交给其它进程异步处理。 答: 可以在本机或者其它服务器甚至服务器集群预先建立一些任务进程处理繁重的业务,任务进程数可以开多一些,例如cpu的10倍,然后调用方利用AsyncTcpConnection将数据异步发送给这些

  • 本文向大家介绍Java多线程之异步Future机制的原理和实现,包括了Java多线程之异步Future机制的原理和实现的使用技巧和注意事项,需要的朋友参考一下 项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable看下面的代码: 虽然可以实现获取异步执行结果的需求,但是我们发现这个F

  • 本文向大家介绍Spring Boot使用Spring的异步线程池的实现,包括了Spring Boot使用Spring的异步线程池的实现的使用技巧和注意事项,需要的朋友参考一下 前言 线程池,从名字上来看,就是一个保存线程的"池子",凡事都有其道理,那线程池的好处在哪里呢? 我们要让计算机为我们干一些活,其实都是在使用线程,使用方法就是new一个Runnable接口或者新建一个子类,继承于Threa

  • 本文向大家介绍Django异步任务线程池实现原理,包括了Django异步任务线程池实现原理的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Django异步任务线程池实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 当数据库数据量很大时(百万级),许多批量数据修改请求的响应会非常慢,一些不需要即时响应的任务可以放到后台的异步线程中