java - Java 中的 IllegalMonitorStateException

标签 java multithreading file-io synchronization illegalmonitorstateexcep

我收到了 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/

相关文章:

java - 平板电脑上 api 22(5.1.1) 的 picasso 缓存错误

java - 将 child 转换到 Java 中的父问题

java - org.hibernate.hql.ast.QuerySyntaxException : table not mapped

php - 在后台运行异步作业 (laravel)

c# - LINQ 可枚举线程

java - 如何将参数传递给 URL 并获取生成的图像

c++ - std::future 可以在没有 get 或 wait 的情况下导致 coredump

c - 是否可以将标准输入/输出设置为 C 中的文件?

c - 将 CSV 文件中的值读入变量

c# - 从 C# 项目中的文件夹获取许可证文件