在JAVA中遇到线程和信号量问题

时间:2014-02-23 19:58:45

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

2 个答案:

答案 0 :(得分:0)

你可以在第一个线程上使用Thread.join(),这样第二个线程就会等到这个实例的执行没有完成。

答案 1 :(得分:0)

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

使用

sem.wait();

sem.notifyAll();