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