Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在两个线程之间共享变量_Java_Multithreading_Design Patterns - Fatal编程技术网

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。。。不是真的。我只是觉得线程可以调用它来获取信号量。一次只能有一个线程,另一个线程会阻塞。可能的重复他没有说两个线程不能同时运行。他说他们不应该同时运行系统任务。在此期间,他们可能还有其他工作要做。