gpt4 book ai didi

java - Java 中的 IllegalMonitorStateException

转载 作者:行者123 更新时间:2023-12-01 10:01:16 24 4
gpt4 key购买 nike

我收到了 IllegalMonitorStateException在我的代码中。

内部startEmployeeProcess()我启动一个thread1的方法(EmployeeThread) 在开关内部我称之为 thread1.wait() (案例3)

我的代码有什么问题?

请帮忙

谢谢

public class EmployeeManager {

private ArrayList<Employee> employees = new ArrayList<Employee>();
Scanner sc = null;

private synchronized void startEmployeeProcess(EmployeeManager employeemanager) {
System.out
.println("********************THREAD OBJECT CREATION PROCESS STARTED**************************");
EmployeeThread employethread = new EmployeeThread(employees);
Thread thread1 = new Thread(employethread);
System.out
.println("********************GOING TO START THE FILE WRITER THREAD******************************");
thread1.start();
Scanner sc = new Scanner(System.in);
do {
System.out.println("Choose any one option");
System.out.println("1.Create Employee");
System.out.println("2.Search Employee by id");
System.out.println("3.delete Employee by id ");
System.out.println("4.Print all employee Employee details");
int choice = sc.nextInt();
switch (choice) {
case 1:
employeemanager.createEmployee();
break;
case 2:
System.out.println("Enter Empid");
int empId = sc.nextInt();
employeemanager.searchEmployee(empId);
break;
case 3:



System.out.println("Enter EmpId ");
try {
System.out.println("*************************FILE WRITER THREAD IS IN WAIT PROCESS**********************");
thread1.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("***************Deleting*****************");
int EmpId = sc.nextInt();
synchronized(employees)
{
boolean isEmployeeDeleted = employeemanager.deleteEmployee(EmpId);
if (isEmployeeDeleted) {
System.out.println("Employee is deleted ....!");
} else {
System.out.println("Employee not found");
}
System.out.println("*************************FILE WRITER THREAD IS NOTIFIED**********************");
thread1.notify();
}
break;


case 4:

employeemanager.printAllEmployeeDetails();

default:
System.out.println("wrong choice plz try again....");
break;

}
} while (true);
}

public static void main(String[] args)
{
EmployeeManager employeemanager = new EmployeeManager();
employeemanager.startEmployeeProcess(employeemanager);

}

public void createEmployee() {
Employee employee = new Employee();
sc = new Scanner(System.in);
System.out.println("Enter Employee Name");
String empName = sc.next();
System.out.println("Enter employee Id");
int empId = sc.nextInt();
System.out.println("Enter employee worklocation");
String empWorkLocation = sc.next();
System.out.println("Enter employee Mobile Number");
int mobNo = sc.nextInt();
System.out.println("Enter Employee Address");
String empAddress = sc.next();
System.out.println("Enter Employee Age");
int empAge = sc.nextInt();
employee.setEmpName(empName);
employee.setEmpId(empId);
employee.setEmpWorkingLocation(empWorkLocation);
employee.setEmpMobileNo(mobNo);
employee.setEmpAddress(empAddress);
employee.setEmpAge(empAge);
employees.add(employee);
System.out.println("employee created ....!");
}

public void searchEmployee(int empId) {
Iterator<Employee> iterator = employees.iterator();
while (iterator.hasNext()) {
Employee employee = (Employee) iterator.next();
int empid = employee.getEmpId();
if (empId == empid) {
System.out.println(employee);
} else {
System.out.println("Employee not found");

}
}

}

public boolean deleteEmployee(int EmpId) {
Iterator<Employee> iterator = employees.iterator();
while (iterator.hasNext()) {
Employee employee = (Employee) iterator.next();
int empid = employee.getEmpId();
if (EmpId == empid) {
iterator.remove();
return true;

}

}
return false;
}

public void printAllEmployeeDetails() {
System.out.println("all employee deatils are ...");
System.out.println(employees);

}

}

类(class):

员工线程

public class EmployeeThread implements Runnable {
private ArrayList<Employee> employees;

public EmployeeThread(ArrayList<Employee> employees) {
this.employees = employees;
}

public void run() {
try {
synchronized(employees)
{

String filename = "employee.txt";
FileWriter filewriter = new FileWriter(filename);
BufferedWriter bufferedwriter = new BufferedWriter(filewriter);
while (true) {
for (Employee employee : employees)
{
if (employee.getReadStatus().equalsIgnoreCase("R"))

{
bufferedwriter.write(employee.toString());
employee.setReadStatus("W");
}
}
employees.wait();
employees.notify();
}
}

} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();

}

}
}

最佳答案

错误是显而易见的:

thread1.wait();
thread1.notify();

请记住,您必须在同一对象的同步块(synchronized block)中调用该对象的wait()notify(),也就是说您必须在调用wait()notify()之前获取对象的监视器锁,例如:

synchronized(obj1){
// obj1.wait();
// or obj1.notify();
}

我想你应该清楚java synchronized关键字,你可以看看这个tutorial .

希望能帮到你。

关于java - Java 中的 IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36785349/

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