【发布时间】:2015-10-27 20:44:27
【问题描述】:
我试图让一个程序通过一个信号量运行两个线程。信号量必须从 0 开始。 最后应该在屏幕上显示一条消息:
System.out.println ("string number" + i);
其中'i'是进程号
我的代码是:
public class Orden extends Thread {
int id;
int num;
static Semaphore semaphore = new Semaphore (0);
public Orden(int id)
{
this.id= id;
}
@Override
public synchronized void run()
{
try
{
if(semaphore.availablePermits() == 0){
semaphore.release(1);
System.out.println(semaphore.availablePermits());
}
else{
System.out.println("Thread: " + this.id);
}
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
public static void main(String[] args)
{
Orden o1 = new Orden(1);
Orden o2 = new Orden(2);
o1.start();
o2.start();
}
}
我哪里错了?我究竟做错了什么? 谢谢
【问题讨论】:
-
没有按照您的意愿工作?
-
不,预期的结果是:线程2线程1因为线程1找到信号量=0,然后释放,执行新线程,解锁线程1..结果我有是:2 或没有
-
“解锁线程 1”是什么意思?您的线程之间没有同步。您不会进行任何会导致一个线程等待另一个线程的调用。
-
对不起,我编辑了我的帖子,我测试了一些东西,我忘了写同步.. 仍然不起作用我的意思是信号量初始化为 0,线程 1 应该进入临界区并锁定,运行导线 2,显示“线程 2”,然后解锁导线 1 并显示“线程 1”。我的问题是有时我得到“线程 2”,而其他时候我什么也没有得到
-
通过将
run()方法声明为synchronized,您希望达到什么目的。您是否试图防止两个线程之间的 any 重叠?在那种情况下,为什么要使用线程呢?使用线程的全部意义在于不同的线程可以同时做不同的事情。如果您不希望它们同时运行,永远,那么没有理由使用两个线程。
标签: java multithreading semaphore