Java 如何在两个线程之间共享变量
我刚刚继承了一些代码,代码中的两个线程需要执行一个系统任务。一个线程应该在另一个线程之前完成系统任务。他们不应该一起执行系统任务。这两个线程彼此没有引用 现在,我知道我可以使用某种信号量来实现这一点。但我的问题是,让两个线程访问这个信号量的正确方法是什么 我可以在一个新类中创建一个静态变量/方法:Java 如何在两个线程之间共享变量,java,multithreading,design-patterns,Java,Multithreading,Design Patterns,我刚刚继承了一些代码,代码中的两个线程需要执行一个系统任务。一个线程应该在另一个线程之前完成系统任务。他们不应该一起执行系统任务。这两个线程彼此没有引用 现在,我知道我可以使用某种信号量来实现这一点。但我的问题是,让两个线程访问这个信号量的正确方法是什么 我可以在一个新类中创建一个静态变量/方法: public class SharedSemaphore { private static Semaphore s = new Semaphore (1, true); public
public class SharedSemaphore
{
private static Semaphore s = new Semaphore (1, true);
public static void acquire () {
s.acquire();
}
public static void release () {
s.release();
}
}
这是可行的(对吗?),但这似乎不是正确的做法。因为,线程现在可以访问信号量,而不必引用它。这类事情似乎不是一个好的编程实践。我错了吗
更新:
我将这两个方法重命名为performTask以获取,另一个重命名为release,因为我觉得这会分散我对实际问题的注意力。我认为,您可以将
performSystemTask
方法同步化,这就足够了。如果线程总是一个接一个地运行,它们需要一个管理器。我会把它们包装成另一个类,甚至是另一个线程类
public class wrapperThread extends Thread {
public void run() {
Worker1Thread myThread = new Worker1Thread();
myThread.start();
myThread.join();
Worker2Thread myThread = new Worker2Thread();
myThread.start();
myThread.join();
}
}
这是我能想到的最安全、最干净的方法
如果它们永远不应该同时运行,那么它们应该是同一个线程。我看到您公平地使用了信号量。我猜你关心这些“系统任务”的执行顺序?那么,在我看来,依靠线程的有序到达是非常脆弱和危险的。如果使用synchronized
关键字,也会出现此问题
我想你应该改用倒计时锁存器
class TaskOrganizer {
private final CountdownLatch firstTask = new CountdownLatch(1);
public void firstTaskIsDone(){
firstTask.countDown();
}
public void permissionForSecondaryTask(){
firstTask.await();
}
}
如果无法将taskmanager
对象传递给线程,那么我想将其设置为静态是可以的,但通常最好将实例传递给线程(确切地说,传递给可运行程序)。你永远不知道你是否需要2个任务组织者。如果您使用了静态
,那么事情就不会像本来那样干净了
我想这很明显,但是一个线程调用firsttaskistone()
,另一个线程阻塞直到完成,调用permissionForSecondaryTask()代码>。如果您有大量的任务要用大量的线程来组织,那么您可能希望推出Phaser
(计划在JDK 7中出现,backport可在上获得) 我没有时间写答案,但这可能会有帮助:。为什么不用关键字synchronized来标记performSystemTask()方法?@prmatta:在performSystemTask()中,除了获取你想要写的锁“//在这里做一些事情”对吗?在这种情况下,同步该方法并放弃信号量和donePerformingSystemTask方法。@Wizardofods:Hmm。。。不是真的。我只是觉得线程可以调用它来获取信号量。一次只能有一个线程,另一个线程会阻塞。可能的重复他没有说两个线程不能同时运行。他说他们不应该同时运行系统任务。在此期间,他们可能还有其他工作要做。