我想创建一个应该在其他会话中共享的工作线程。基本上我想限制其他用户执行相同的过程。所以他们将通过我创建的静态对象线程实例来检索线程。如果线程仍处于活动状态,则会提示错误。
还有其他方法可以做到这一点,因为我在考虑将一个Thread对象放在静态中是否安全?我也在考虑应用程序上下文,但我不确定哪种更好的方法在java中执行此操作?
答案 0 :(得分:2)
将任何对象放置在静态或任何类型的共享位置本身并不安全,但您需要注意设计。
声明
static Thing t;
初始化
if ( t == null ) {
t = new Thing();
}
使用
t.dosomething();
现在如果两个线程同时触及初始化块会发生什么?你可以创造两件事。可能不希望这样,所以使用同步。
synchronized void intialise() {
if ( t == null ) {
t = new Thing();
}
}
如果两个线程同时尝试使用t会发生什么。这取决于Thing的承诺。如果它的线程安全没问题,否则你的代码需要提供同步
synchronized void doSomthing() {
t.doSomething();
}
答案 1 :(得分:1)
我会对您设置的静态字段使用锁定,以避免两个任务启动该过程的可能性。您可以存储线程,以便在完成时知道它或者在运行时标记AtomicBoolean。 (你也可以锁定)
答案 2 :(得分:1)
您可以使用原子布尔值来标记工作线程的状态,并仅在错误时返回该线程。
当工作线程启动时,您需要将其设置为true。