1.设置系统最大可登录用户数为 3; 2.登录页面增加 “登录所有用户”按钮,点击按钮后,根据最大可登录用户 数登录所有用户; 3.控制台输出申请登录的学生、登录成功的学生以及登录失败的学生; 4.必须使用到多线程编程技术和同步机制; 5.系统已经注册的用户要超过 3 个。
时间: 2024-02-20 17:59:19 浏览: 15
以下是一个基本的 Java 实现:
```java
import java.util.ArrayList;
import java.util.List;
public class LoginSystem {
private static final int MAX_USERS = 3; // 最大可登录用户数
private static List<User> registeredUsers = new ArrayList<>(); // 已注册用户列表
private static List<User> loggedInUsers = new ArrayList<>(); // 已登录用户列表
public static void main(String[] args) {
// 注册用户
registeredUsers.add(new User("Alice", "123"));
registeredUsers.add(new User("Bob", "456"));
registeredUsers.add(new User("Charlie", "789"));
registeredUsers.add(new User("David", "abc"));
// 创建登录线程
Thread loginThread = new Thread(new LoginTask());
loginThread.start();
}
// 用户类
private static class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}
// 登录任务
private static class LoginTask implements Runnable {
@Override
public void run() {
while (true) {
// 检查已登录用户数是否达到最大值
synchronized (loggedInUsers) {
if (loggedInUsers.size() >= MAX_USERS) {
try {
// 如果已达到最大值,等待一段时间后重新检查
loggedInUsers.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 查找未登录的用户
User userToLogin = null;
synchronized (registeredUsers) {
for (User user : registeredUsers) {
if (!loggedInUsers.contains(user)) {
userToLogin = user;
break;
}
}
}
// 如果找到未登录的用户,进行登录
if (userToLogin != null) {
synchronized (loggedInUsers) {
loggedInUsers.add(userToLogin);
System.out.println(userToLogin.getUsername() + " 登录成功");
System.out.println("已登录用户:" + loggedInUsers);
loggedInUsers.notifyAll();
}
} else {
System.out.println("没有可登录的用户");
}
// 等待一段时间后继续执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
```
解释一下代码:
1. 使用 `registeredUsers` 列表存储已注册的用户,使用 `loggedInUsers` 列表存储已登录的用户;
2. 在 `main` 方法中注册用户,并创建一个 `LoginTask` 线程来执行登录任务;
3. `User` 类表示一个用户,包括用户名和密码两个字段;
4. `LoginTask` 类实现了 `Runnable` 接口,表示登录任务。在 `run` 方法中,使用 `synchronized` 关键字同步对 `loggedInUsers` 和 `registeredUsers` 列表的访问;
5. 在 `while` 循环中,先检查已登录用户数是否达到最大值。如果已达到最大值,则等待一段时间后重新检查;
6. 在 `registeredUsers` 列表中查找未登录的用户。如果找到,则进行登录,并将该用户加入 `loggedInUsers` 列表。在加入列表前,先使用 `synchronized` 关键字同步对 `loggedInUsers` 列表的访问;
7. 如果未找到未登录的用户,则输出提示信息;
8. 最后,等待一段时间后继续执行,以免线程过于频繁地执行。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)