gpt4 book ai didi

java - 当在 run 方法中调用 sleep 时,Runnable 类中的方法会阻塞吗?

转载 作者:行者123 更新时间:2023-12-01 18:32:57 30 4
gpt4 key购买 nike

我有一个实现 Runnable 接口(interface)的类:类似于:

    public class MyClass implements Runnable{

public MyClass(){
//I have a queue object
mQueue = new LinkedList<MyObject>();

}

public void addToQueue(MyObject onj){
mQueue.add(obj);
}

@Override
public void run(){
while(true)
{
//Do some stuff(dequeue and write to file)
Thread.sleep(500);

}
}
}
}

所以这个 runnabale 类将在另一个类中开始。添加到此队列的类(也已启动 Runnable)将始终添加到队列中。

我想知道当while循环中调用sleep时,addToQueue方法还有效吗?我的意思是,当该线程处于 sleep 状态时,启动该线程的类可以添加到队列中...所以基本上 run() 方法会阻止该类中的其他方法?

最佳答案

线程是独立的概念。类和方法不会阻塞;线程可以。

如果你有这个:

    MyClass mc = new MyClass();
mc.run(); // this will never return

该代码在单线程中运行; Thread.sleep(500) 在线程中运行,并在每次调用时阻塞线程。当线程 hibernate 时,线程中的执行将停止。 (事实上​​,mc.run() 由于其无限循环而永远不会返回。)

但是,如果多个线程引用特定的 MyClass 实例,则每个线程都可以独立调用该对象的方法。每个线程独立于其他线程执行(除非涉及同步)。

    MyClass mc = new MyClass();
Thread thread = new Thread(mc);
thread.start();
for (int i = 0; i < 100; ++i)
{
MyObject obj = new MyObject();
mc.addToQueue(obj);
}

此代码创建一个新线程(将其称为线程 B)并启动它,这会导致 run() 在新线程中的 mc 对象实例。现在有两个线程——原始线程线程A,和新线程线程B。两者相互独立执行。特别是,线程 A 可以在线程 B 运行 run() 的同时操作该对象(出于我们的目的)。如果您不小心避免潜在的操作冲突,您将遇到意想不到的结果和难以重现的失败。在您的代码中,如果多个线程可以在没有充分同步的情况下对给定对象调用 addToQueue() ,那么您最终会遇到麻烦,因为 LinkedList 不是线程安全的类。

并发和线程安全可能很难得到正确的解决。 Brian Goetz 等人所著的《Java Concurrency in Practice》一书。等人。是一个很好的开始。

关于java - 当在 run 方法中调用 sleep 时,Runnable 类中的方法会阻塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305465/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com