当前位置: 首页 > 知识库问答 >
问题:

调用内部有线程的方法意味着等待?

湛博易
2023-03-14

我有一个写文件的方法,它可能有点慢。因此,我这样做是为了避免阻止其他操作:

// things A
method();
// things B

public void method(){
 new Thread(() -> {
    // slow stuff
 }).start();
}

然而,直到在a之后执行B之后,仍然需要一段时间,我想知道是否应该这样做:

// things A
new Thread(() -> {
    method();
}).start();
// things B

public void method(){
    // slow stuff
}

或者,换句话说,调用一个内部有线程的方法是否意味着等待该方法结束,从而等待线程结束?

只是为了澄清一些事情:我想知道两个选项是否相同,或者在第一个选项中,线程是否应该完成以启动B指令

共有1个答案

韦昊焜
2023-03-14

调用带有线程的方法是否意味着等待方法结束,因此线程结束?

不。为了强调线程不是一个因素,我使用了您的原始代码:

method();
// things B

public void method(){
 new Thread(() -> {
    // slow stuff
 }).start();
}

并在整个过程中散布了一堆System.out.println()调用:

  • 一个在调用method()之前,一个在
  • 之后
  • 一个在method()的开头,一个在末尾
  • 一个在线程体的开始,一个在末尾

也:

  • 线程通过调用Thread.sleep()2秒来执行“慢速操作”
  • 每个println()包括当前日期时间
  • 输出用缩进粗略格式化,以显示每个输出的开始/结束对
import java.time.LocalDateTime;

public class ThreadExample {

    public static void main(String[] args) {
        System.out.println("main >> " + LocalDateTime.now());
        new ThreadExample().method();
        System.out.println("main << " + LocalDateTime.now());
    }

    public void method() {
        System.out.println("  method >> " + LocalDateTime.now());
        new Thread(() -> {
            System.out.println("    thread >> " + LocalDateTime.now());
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("    thread << " + LocalDateTime.now());
        }).start();
        System.out.println("  method << " + LocalDateTime.now());
    }
}

下面的输出显示了一些内容:

  • main中的第一秒输出行(调用method()之前和之后)基本上是瞬时的-09:10:22.036305开始,09:10:22.037957结束,相差0.001652秒
  • method()相同,从09:10:22.037564开始到09:10:22.037897结束几乎是瞬时的,相差0.000333秒
  • 线程中的开始和结束输出是等待的位置,从09:10:22.037920开始,到09:10:24.041840结束;总差异为2.00392秒,这是我们在Thread.sleep()中要求的2秒,加上与其他线程类似的少量执行时间(0.00392)
  • 也许对于这个问题最重要的是,很明显原始调用者(在main()中)和method()都在线程完成之前完成~2秒后
main >> 2022-06-17T09:10:22.036305
  method >> 2022-06-17T09:10:22.037564
  method << 2022-06-17T09:10:22.037897
    thread >> 2022-06-17T09:10:22.037920
main << 2022-06-17T09:10:22.037957
    thread << 2022-06-17T09:10:24.041840
 类似资料:
  • 我正在读一本关于JPA和EJB的书,上面有一行写着: “单例会话bean可以使用容器管理或bean管理的并发。默认为容器管理,对应于所有业务方法上的写锁。所有业务方法调用都是序列化的,因此在任何给定时间只有一个客户端可以访问bean。同步过程的实际实现由供应商提供。”-具体的。" 序列化方法调用意味着什么?为什么保证在任何给定时间只有一个客户机可以访问bean?

  • Java.lang.AutoCloseable的close()方法的Java文档说 注意,与Closeable的方法不同,此方法不要求是幂等的。换句话说,多次调用此close方法可能会产生一些明显的副作用,这与不同,如果多次调用该方法,则要求该方法无效。但是,强烈鼓励该接口的实现者使其闭式方法是幂等的。 他们所说的幂等方法是什么意思,两次调用这个方法有什么副作用? 既然interface扩展了,为

  • 从逻辑上讲,调用< code>wait方法的线程应该已经获得了正在调用< code>wait的对象的固有锁。 oracle教程中提到“在对象的同步方法中调用< code>wait是获取内部锁的一种简单方法”,这意味着至少还有另一种方法可以获取锁。 我的问题是,为了调用< code>wait,除了在synchronized方法内部调用< code>wait之外,还有其他方法可以获取内部锁吗?...它

  • 问题内容: 我想确切地知道当多个goroutins访问go地图时,假设我们有一个。多个goroutins修改User结构的字段会导致数据损坏吗?还是像非线程安全这样的操作,如果map在Go中是线程安全的,那会有什么不同? 问题答案: 同时修改可能会导致损坏, 而 与 无关。只要不对映射进行任何修改,从映射中并发读取指针是安全的。修改数据点以不更改地图本身。 同时修改本身也会冒数据损坏的风险。 没有

  • 我想创建一个

  • 我正在使用AndroGuard从Android应用程序的源代码中收集API调用。一些检索到的API调用在其调用描述中有$符号,例如:或,而绝大多数调用都不包括这个美元符号。例如,。 $符号在一些编程中表示变量引用,但在API调用引用中找到它是很奇怪的。我在这里怎么解释?在API调用跟踪的上下文中,$符号意味着什么?