java - JAVA 中的线程和信号量出现问题

标签 java multithreading wait semaphore notify

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

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

最佳答案

问题是 notifynotifyAll 只能唤醒在被通知的监视器上持有锁的线程。但是 t1t2 实例正在等待自己并且永远不会被唤醒。您可以让他们等待信号量来进行这个简单的测试,或者引入一个新的共享对象来查看它是如何工作的。

使用

sem.wait();

sem.notifyAll();

关于java - JAVA 中的线程和信号量出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21973719/

相关文章:

java - 处理 TableModelEvent 时是否允许修改 JTable 的模型?

java - 使用按钮切换 View 与 Android SDK

Java Hibernate @OneToMany 标准投影返回 NULL

multithreading - Scala并行集合: Idiomatic way of having thread-local-variables for worker threads

c# - 当 OnClick_Event 发生时立即更新 UI

JavaFX-获取一个 ImageView 的图像并将其分配给另一个 ImageView

javac 在 CPU 利用率上变得疯狂 ECJ 能够为多线程生产者-消费者维持可预测的 CPU 利用率

Powershell 等待进程

javascript - Selenium + JS : driver. wait(until.elementLocated(By(), 2000)) 有时会卡住

c - 如何在 Linux 中等待一个程序的多个实例完成?