实现当用户 1 没有主动注销但超过 30 秒无活动时自动注销,并允许用户 2 登录:
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class FTPLimitLogin {
private boolean isConnected = false; // 标识位,表示是否有用户连接
private String connectedUser; // 记录连接的用户
private ConcurrentHashMap<String, Long> lastActivityTimes = new ConcurrentHashMap<>(); // 存储用户最后活动时间
private ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
public boolean checkLogin(String userName) {
if (isConnected &&!connectedUser.equals(userName)) {
return false; // 已有其他用户连接,登录失败
}
if (isConnected && connectedUser.equals(userName)) {
// 如果是已连接的用户重新登录,更新最后活动时间
lastActivityTimes.put(userName, System.currentTimeMillis());
return true;
}
isConnected = true;
connectedUser = userName;
lastActivityTimes.put(userName, System.currentTimeMillis()); // 记录登录时间
return true; // 登录成功
}
public void logout(String userName) {
if (connectedUser.equals(userName)) {
isConnected = false;
connectedUser = null;
lastActivityTimes.remove(userName); // 移除用户的最后活动时间记录
}
}
public void markActivity(String userName) {
lastActivityTimes.put(userName, System.currentTimeMillis()); // 更新用户的最后活动时间
}
public void startWatchdog() {
executorService.scheduleAtFixedRate(() -> {
if (isConnected) { // 如果有用户连接
long currentTime = System.currentTimeMillis();
long lastActivityTime = lastActivityTimes.get(connectedUser);
if (currentTime - lastActivityTime > 30000) { // 30 秒内无活动
logout(connectedUser); // 自动注销
System.out.println(connectedUser + " 因超时被自动注销。");
}
}
}, 30, 30, TimeUnit.SECONDS);
}
public static void main(String[] args) {
FTPLimitLogin ftpLimitLogin = new FTPLimitLogin();
ftpLimitLogin.startWatchdog();
// 用户 1 尝试登录
String userName1 = "user1";
boolean canLogin1 = ftpLimitLogin.checkLogin(userName1);
if (canLogin1) {
System.out.println("user1 登录成功");
// 模拟用户 1 活动
ftpLimitLogin.markActivity(userName1);
} else {
System.out.println("user1 登录失败,已有用户连接");
}
// 一段时间没有活动
try {
Thread.sleep(35000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 用户 2 尝试登录
String userName2 = "user2";
boolean canLogin2 = ftpLimitLogin.checkLogin(userName2);
if (canLogin2) {
System.out.println("user2 登录成功");
} else {
System.out.println("user2 登录失败,已有用户连接");
}
}
}
在上述修改后的代码中,用户 1 登录后一段时间没有活动(超过 30 秒),看门狗会自动将其注销,此时用户 2 可以成功登录。