Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Wait_Semaphore_Notify - Fatal编程技术网

JAVA中的线程和信号量有问题

JAVA中的线程和信号量有问题,java,multithreading,wait,semaphore,notify,Java,Multithreading,Wait,Semaphore,Notify,我不熟悉线程和信号量,在同步线程方面有一些问题。例如,在下面的代码中,我想做一件非常简单的事情。让一个线程运行,而另一个线程等待。例如,如果它从第一个线程开始,我希望第二个线程等待第一个线程完成,然后开始。我真的不知道我做错了什么。 代码如下: import java.io.*; import java.util.concurrent.Semaphore; public class ThreadTest { public static void main(String[] args)

我不熟悉线程和信号量,在同步线程方面有一些问题。例如,在下面的代码中,我想做一件非常简单的事情。让一个线程运行,而另一个线程等待。例如,如果它从第一个线程开始,我希望第二个线程等待第一个线程完成,然后开始。我真的不知道我做错了什么。 代码如下:

import java.io.*;
import java.util.concurrent.Semaphore;

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException {
        Semaphore binaren = new Semaphore(1);
        Runnable t1 = new T2(binaren);
        Thread a = new Thread(t1);
        Thread a2 = new T1(binaren);
        System.out.println(binaren.availablePermits());
        a.start();
        a2.start();
    }
}
class Work {

    private static int a = 4;
    public synchronized static void QQR(String s1)
    {
        for(int i=0;i<100;i++)
        System.out.println(s1+" : "+(a++));
    }

}
class T1 extends Thread
{
    Semaphore sem;
    public T1(Semaphore s1)
    {
        sem=s1;
    }
    public void run()
    {   
        synchronized(this)  {
            if(!sem.tryAcquire()){
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Work.QQR("T1");
            sem.release();
            notifyAll();
        }

    }


}
class T2 extends Thread
{
    Semaphore sem;

    public T2(Semaphore s1)
    {
        sem=s1;
    }

    @Override
    public void run() {
    synchronized(this)  {
        if(!sem.tryAcquire()){
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        Work.QQR("T2");
        sem.release();
        notifyAll();
    }
}
}
您可以在第一个线程上使用Thread.join,以便第二个线程将等待此实例的执行未完成。

问题在于,notify和notifyAll只唤醒在被通知的监视器上持有锁的线程。但是t1和t2实例正在等待它们自己,并且从未被唤醒。您可以让他们等待这个简单测试的信号量,或者引入一个新的共享对象来查看它是如何工作的

使用


是的,我只能用信号量做同样的事情,但问题是我真的想了解wait和notify是如何工作的。使用wait,你可以在特定时间内等待任何线程的执行/直到你通知它。这就是我遇到的问题。我不明白为什么我的代码不能工作。例如,如果线程a首先启动,那么线程a2将等待。当a完成时,我使用notify all,a2应开始运行。这就是它应该如何工作的吗?如果你在t2上使用wait,那么它将一直等到你在t2上应用notify或notifyall。我知道这只是测试代码,但是如果你不使用t1和t2并将t2实例分配给t1 wtf,你将获得十倍的读卡器?因为你试图理解wait和notify不适用,但是,通常使用并发类可以避免使用监视器原语。很抱歉,代码太乱了,我只是感到很沮丧,并将其以未匹配的方式发布。我是stackoverflow新手,第一次在线寻求代码帮助。我会努力在将来做得更好。非常感谢,这真的很有帮助:@user3344207因为您试图理解wait and notify,它不适用,但通常使用并发类可以避免使用监视器原语。
sem.wait();
sem.notifyAll();