我是线程和信号量的新手,我在同步线程时遇到了一些问题。例如,在下面的代码中我想做一个非常简单的事情。让一个线程运行,而其他线程等待。例如,如果它从第一个线程开始,我希望第二个线程等待第一个线程完成然后开始。我真的不知道我做错了什么。 这是代码:
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();
}
}
}
答案 0 :(得分:0)
你可以在第一个线程上使用Thread.join()
,这样第二个线程就会等到这个实例的执行没有完成。
答案 1 :(得分:0)
问题是notify
和notifyAll
只唤醒持有通知监视器锁的线程。但是t1
和t2
实例正在等待自己,并且永远不会被唤醒。您可以让他们在信号量上等待这个简单的测试,或者引入一个新的共享对象来查看它是如何工作的。
使用
sem.wait();
和
sem.notifyAll();