【问题标题】:Multithread Semaphore java多线程信号量java
【发布时间】: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


【解决方案1】:

您的运行是同步的,但您在两个不同的对象 o1 和 o2 上同步,因此它实际上是不同步的。您可以在信号量等静态对象上使用同步块,这样它们就会在同一个对象上同步。

@Override
public void run() {
    try {
        synchronized (semaphore) {
            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());
    }

}

【讨论】:

  • 感谢您的评论...通过您的解决方案,我得到了第一个线程在第一个位置,我的英语太糟糕了,但我用示例解释:使用您的代码,我得到这个:线程1 线程 2 我想要的响应是:线程 2 线程 1 无论如何,谢谢
  • 如果你想保证线程1首先运行,那么线程1肯定有一些不同。它们都是同时启动的,所以不会是这样。你可以做很多事情,但你不能真正使用信号量,因为它对于两个线程都是一样的。信号量的用途不是让一个线程先于另一个线程运行。
  • @JoseMaria,无论如何,您使用Semaphore 的方式,您不妨改用int。你只测试它的值(非阻塞),并增加它的值(也是非阻塞的)。信号量的所有魔力都在它的 acquire() 方法中,您的代码永远不会调用该方法。
猜你喜欢
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2012-12-22
  • 2015-09-30
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多