嗨,对于我的java版本,我正在阅读过去的纸质问题而且我被困住了。我给了这个代码:
class FriendFinderThread extends Thread {
// number of FriendBook friends
int numFriends = 0;
public void run() {
// join, then leave FriendBook
FriendBook.join(this);
try { Thread.sleep(10000); }
catch (InterruptedException(ie) {}
FriendBook.leave(this);
}
}
class FriendBook {
// list of FriendBook members
static Vector<FriendFinderThread> members =
new Vector<FriendFinderThread>();
static void join(FriendFinderThread f) {
// add a new friend to all existing members
int size = members.size();
for (int i = 0; i < size; i++) {
members.elementAt(i).numFriends++;
}
f.numFriends = size; // new member’s friends
members.add(f); // add to list of members
}
static void leave(FriendFinderThread f) {
members.remove(f); // remove from list
int size = members.size();
for (int i = 0; i < size; i++) {
members.elementAt(i).numFriends--;
}
}
public static void main() {
for (int n = 0; n < 100; n++) {
new FriendFinderThread().start();
}
}
}
我在理解正在发生的事情时遇到了麻烦,有人可以解释一下代码中发生的事情以及代码可能会遇到干扰问题。
谢谢
答案 0 :(得分:0)
在某个时刻,一个线程会调用join。这使用members.size()并访问成员中的每个元素。在这样做的同时,另一个成员将离开(后面的线程将越慢,因为它们越过更多的元素,所以在某些时候会有更多的离开而不是加入)。这意味着members.elementAt(members.size() - 1)将抛出错误。