Java线程相关的问题

时间:2009-09-30 18:37:22

标签: java

Class Ui{
    synchronized update()
    {
           do something
    }

    synchronized stop()
    {
          do something
    }
}

多个线程正在访问上述类的方法..

    RunnableUI rm1 = new RunnableUI();
    RunnableUI rm2 = new RunnableUI();


    Thread rmt1 = new Thread(rm1);
    Thread rmt2 = new Thread(rm2);


    rmt1.start();
    rmt2.start();

和Runnable UI Class是

class RunnableUI implements Runnable
{

    public void run()
    {
        Ui u1 = new Ui();

        u1.update(20);

        u1.stop();
    }
}

我想要做的是在第一个线程调用stop方法之后,第二个等待的线程应该开始执行..

我该怎么做..

此致 Kaddy

4 个答案:

答案 0 :(得分:1)

您希望线程按顺序执行吗?

它没有用,但在这种情况下你应该插入一个“rmt1.join();” (和必要的异常处理)两次开始调用之间。

答案 1 :(得分:1)

我认为你想要的是Semaphore。信号量保持固定数量的许可(在您的情况下为1)。您acquire中的updaterelease stop中的许可{{1}}。如果需要,我会重新编辑以添加代码示例。

答案 2 :(得分:1)

使用ExecutorService

RunnableUI rm1 = new RunnableUI();
RunnableUI rm2 = new RunnableUI();

ExecutorService processingThread = Executors.newFixedThreadPool(1);
processingThread.submit(rm1);
processingThread.submit(rm2);

processingThread.shutdown();

将调用第一个Runnable并继续运行,直到某些事件调用stop或runnable完成。一旦发生这种情况,下一个Runnable将会启动,等等。

有了这个,您可以链接任意数量的runnable,重新配置服务以使用多个线程并行执行等。它非常灵活。

编辑:我刚刚意识到根据你的描述,你不想等待第一个runnable停止。如果这是真的,那么这并没有达到标准,但无论如何我都会离开它。

答案 3 :(得分:0)

@Kaddy,您发布的代码有两个问题:

  1. 您有多个UI实例,
  2. 您的锁定是按方法进行的,但似乎您希望锁定各种方法。
  3. 让我解释一下。首先,快速解释synchronized。请考虑以下代码:

    class MyClass {
      synchronized void myMethod() {
        // do something
      }
    }
    

    这基本上是简写:

    class MyClass {
      void myMethod() {
        synchronized (this) {
          // do something
        }
      }
    }
    

    synchronized的工作原理是,如果多个线程尝试在同一个实例上进行同步,则一次只能在同步块内部使用一个。当进入内部的线程离开块时 - 通过常规执行或由于异常 - 然后允许其余一个线程进入其同步块。这种情况一直持续到没有线程试图获取该实例的锁定。

    所以你的第一个问题是:每个线程都有自己的Ui实例。因此线程在不同实例上同步。您可以通过两种方式解决该问题。

    共享一个Ui实例:

    UI ui = new UI();
    RunnableUI rm1 = new RunnableUI(ui);
    RunnableUI rm2 = new RunnableUI(ui);
    

    或锁定UI实例以外的内容:

    class UI {
      private static final Object LOCK = new Object();
    
      public Object getLock() {
        return LOCK;
      }
    
      public void update() {
        synchronized (getLock()) {
          // do something
        }
      }
      ...
    }
    

    你的第二个问题。你没有足够的锁定。如果您选择共享UI实例,请尝试以下操作:

    class RunnableUI implements Runnable {
      private final UI _ui;
    
      RunnableUI(UI ui) {
        _ui = ui;
      }
    
      public void run() {
        synchronized (_ui) {
          _ui.update(20);
          _ui.stop();
        }
      }
    }
    

    如果您选择共享锁定,请尝试以下操作:

    class RunnableUI implements Runnable {
      public void run() {
        UI ui = new UI();
        synchronized (ui.getLock()) {
          ui.update(20);
          ui.stop();
        }
      }
    }