gpt4 book ai didi

Java new Thread 使用这个 - 有什么理由它是好/坏吗?

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

只是一个简单的问题,看看下面的代码,有什么理由不这样做或者可以吗?

public class MyClass implements Runnable, MyClassInterface {

Thread threader;

void start() {
threader = new Thread(this);
threader.start();
}

@Override
public void run() {
Thread current = Thread.getCurrentThread();
while (threader = current) {
..
}
}
}

最初的逻辑并不是向调用者公开它在单独的线程中运行的事实谁创建了“MyClass”,但人们怀疑这是好事还是坏事。

任何人都可以找到不这样做的充分理由或者可以接受吗?可以预期 MyClass.start() 可能会被调用几次。

编辑:更新了代码以显示它正在实现 Runnable 和另一个接口(interface),该接口(interface)由客户端代码使用,实际实现可能在单独的线程、同一线程或任何其他方式中运行。这个想法是将其从客户端中抽象出来,因为客户端只是“MyClass”将通知的一个对象,并且(当前)不知道它实现的 Runnable 接口(interface)。

也许不需要抽象,客户端应该有更多的控制权?

编辑:start() 只是告诉对象它已准备好开始接收通知而不是启动线程。

看看这个:http://docs.oracle.com/javase/8/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

最佳答案

在我看来,这是一个糟糕的设计,因为您通过实现接口(interface)(Runnable)并提供对类的使用者没有用的公共(public)方法(run)来破坏封装。

您可以从 start 方法启动线程,而无需继承 Runnable:

public class MyClass {
private Thread thread;
public void start() {
thread = new Thread(this::doWork); // Java 8 method reference
thread.start();
}
private void doWork() {
// ...
}
}

如果您无法使用 Java 8 中的方法引用,请将 this::doWork 替换为:

new Runnable() { public void run() { doWork(); } }

关于Java new Thread 使用这个 - 有什么理由它是好/坏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23448846/

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