【发布时间】:2020-09-10 14:47:15
【问题描述】:
您能否解释一下为什么在以下程序中以这种方式实现 Runnable 接口是一个糟糕的设计决策?直观地说,如果我必须自己编写这个,我会让 Hotel 成为它自己的类,并在实现 Runnable 的新类中编写 run() 规范。但是,我无法真正解释为什么下面的代码是一个糟糕的设计决策。
该课程为一家酒店建模,其中包含排队等候的人员和房间列表。有几个“工作台”在不同的线程上运行,每个工作台负责将人员从队列中移出并将他们签入可用的房间。为简单起见,不包括退房。方法的实现并不重要(相信它是线程安全的),这个问题是关于将 run() 放入 Hotel 类的设计决策。
public class Hotel implements Runnable {
private final static int NR_ROOMS = 10;
private final Person [] rooms = new Person [ NR_ROOMS ];
private final List < Person > queue = new ArrayList < >();
private final Lock queueLock = new ReentrantLock ();
private boolean occupied (int i) {
return ( rooms [i] != null);
}
private int checkIn ( Person p) {
// add Person to a free room
}
private void enter ( Person p) {
// add a person to the waiting queue
}
// every desk employee should run as a separate thread
@Override
public void run () {
// remove guests from the queue and check them in
}
}
【问题讨论】:
-
请发布可重现的代码示例。如果您注释掉所有方法,我不知道代码有什么不好。另外,我不知道将这个可运行对象添加为线程的主类。
-
将数据类、业务逻辑和多线程混合在一个地方并不是一个好主意。
标签: java multithreading thread-safety runnable