2011-08-24 49 views
1

我想创建一个应该在其他会话中共享的工作线程。基本上我想限制其他用户执行相同的过程。所以他们会通过我创建的对象线程的静态实例来检索线程。如果线程仍然存在,则会提示错误。线程对象可以设置为静态变量

有没有其他的方式来做到这一点,因为我想如果将一个线程对象放在一个静态是安全的?我也在考虑应用程序上下文,但我不确定哪种方法可以在java中执行此操作?

回答

2

将任何对象放置在静态或任何类型的共享位置中都不是本质上不安全的,但您需要注意设计。

声明

static Thing t; 

初始化

if (t == null) { 
     t = new Thing(); 
    } 

使用

t.dosomething(); 

现在会发生什么,如果两个线程在同一时间击中INITIALISE块?你可以得到两件创造的东西。可能不希望这样,所以使用同步。

synchronized void intialise() { 
    if (t == null) { 
     t = new Thing(); 
    } 

} 

如果两个线程同时尝试使用t,会发生什么情况。这取决于Thing所做的承诺。如果是线程安全没有问题,否则你的代码需要提供同步

synchronized void doSomthing() { 
     t.doSomething(); 
    } 
+0

Can Thing be =线程对象? – Nap

+1

事情可能是任何事情,没有什么特别的线程对象。 – djna

1

我会为您设置的静态字段使用锁,以避免两个任务启动进程的可能性。您可以存储线程,以便知道何时完成,或者AtomicBoolean在运行时标记。 (您也可以锁定)

+0

因此,将线程存储为静态是否安全?我的意思是,如果我存储会话,则其他会话无法访问。 – Nap

+1

其安全提供线程安全。然而,这不是正常的做法,值得评论为什么这样做。 –

1

你可以有一个原子布尔来标记你的工作线程的状态,只有当它返回false线程。

当工作线程启动时,您需要将其设置为true。

+0

我知道,但原子布尔可能不会给我线程的实时状态。如果它只是状态是好的,但我想检索线程内的一些信息,如状态消息列表。或者我应该也将状态消息作为一个静态列表? – Nap

+1

如果我需要任何其他信息,那么将所有这些信息保存在一些包装中,并在每次访问时使用锁来保护包装对象(对于读/写)。这很重要,因为您不应该允许直接引用共享对象。所有访问都应该同步。 – Nrj