【问题标题】:IllegalMonitorStateException in Java [duplicate]Java中的IllegalMonitorStateException [重复]
【发布时间】:2016-04-22 05:13:07
【问题描述】:

我的代码中有一个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);

}

}

类:

员工线程

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();

    }

}
}

【问题讨论】:

  • 也许这个问题的答案有帮助stackoverflow.com/questions/13335367/…你需要在同步块中调用wait()。
  • 谢谢,但仍然遇到同样的异常..
  • 在线程上wait() 几乎没有意义。它几乎肯定不会像你认为的那样做。也许您打算使用join()

标签: java multithreading file-io synchronization illegalmonitorstateexcep


【解决方案1】:

错误很明显:

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

请记住,你必须在同一个对象的同步块中调用对象的wait()notify(),也就是说你必须在调用 wait()notify() 之前获取对象的 monitor lock,例如:

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

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

希望能帮到你。

【讨论】:

  • 谢谢哥们,,,你能给出正确的完整代码吗..
  • 我觉得你的逻辑有点混乱,删除员工时不需要thread1.wait()。而且我认为没有必要使用线程将 employees 写入文件。您只需包装一个将员工写入文件的方法,在 createdelete 员工时调用它以刷新最新的 employees 到文件。我建议你使用 Set 而不是 List
  • 感谢您的好建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 2011-10-30
  • 2014-08-03
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多