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
答案 0 :(得分:1)
您希望线程按顺序执行吗?
它没有用,但在这种情况下你应该插入一个“rmt1.join();” (和必要的异常处理)两次开始调用之间。
答案 1 :(得分:1)
我认为你想要的是Semaphore。信号量保持固定数量的许可(在您的情况下为1)。您acquire
中的update
和release
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,您发布的代码有两个问题:
让我解释一下。首先,快速解释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();
}
}
}