Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何唤醒不同实例的线程?_Java_Multithreading_Locking - Fatal编程技术网

Java 如何唤醒不同实例的线程?

Java 如何唤醒不同实例的线程?,java,multithreading,locking,Java,Multithreading,Locking,我有许多相同对象的实例,我想为每个实例启动一个线程。 我的线程应该是同步的,因此每个线程共享一个我每次锁定的公共对象,正如您在我的代码中看到的: public Person(String name, Object1 o){ this.name = name; this.obj1 = o; } public boolean addToList(){ boolean locked; locked = obj1.getLock().tryLock(); Sys

我有许多相同对象的实例,我想为每个实例启动一个线程。 我的线程应该是同步的,因此每个线程共享一个我每次锁定的公共对象,正如您在我的代码中看到的:

public Person(String name, Object1 o){
    this.name = name;
    this.obj1 = o;
}

public boolean addToList(){
    boolean locked;
    locked = obj1.getLock().tryLock();
    System.out.println(this.name+" try to lock");
    while (!locked){
        try{
            obj1.wait();
        }catch (InterruptedException e){
            System.out.println("Error!");
        }
        locked = obj1.getLock().tryLock();
    }

    System.out.println(this.name+" lock ok");
    if(obj1.getPerson().size()<obj1.getNum()){
        System.out.println("0 "+name+" list size: "+obj1.getPerson().size());
        obj1.getPerson().add(this);
        System.out.println("1 "+name+" list size: "+obj1.getPerson().size());
        obj1.getLock().unlock();
        System.out.println("Unlock ok");
        obj1.notifyAll();
        System.out.println("Notifyall ok");
        return true;
    }
    return false;
}
公众人物(字符串名称,Object1 o){
this.name=名称;
此参数为0.obj1=o;
}
公共布尔addToList(){
布尔锁定;
locked=obj1.getLock().tryLock();
System.out.println(this.name+“尝试锁定”);
当(!锁定){
试一试{
obj1.wait();
}捕捉(中断异常e){
System.out.println(“错误!”);
}
locked=obj1.getLock().tryLock();
}
System.out.println(this.name+lock ok);

如果(obj1.getPerson().size()您只是有条件地解锁它。将解锁放入
finally
块中。如果不尝试,我就不能使用finally,那么我该怎么办?为什么代码会调用
tryLock()
?如果您只想让线程等待它获得锁,那么为什么不直接调用
obj1.getLock()).lock()