从方法中删除阻止

时间:2011-02-11 13:06:53

标签: java multithreading blocking

这是作业。

我不想要解决方案,只需要少量的链接或想法。

简单地说我想做的是,

简单示例:

public class Example
{
    public void method()
    {
           int x = doThat();
           //Call other methods which do not depend on x
           return;
    }
}

doThat()是一种已知耗时的方法,导致我的程序阻塞,直到结果返回。我想使用此Object的不同方法,但程序为frozen,直到doThat()完成。那些不同的方法不一定要从本例中使用的method()调用,但可能来自对象外部。

我想过使用线程但是如果我有大量的对象(1000+),这可能不会非常有效(如果我错了请纠正我)。我想如果我使用线程,我必须为每个对象使用一个线程?

除了调用doThat();时可以使调用对象不阻塞的线程之外还有其他方法吗?如果线程是唯一的方法,你能提供链接吗?

知道这样的问题得到了投票我会接受任何downvotes。但请只是一个链接将是伟大的。

提前致谢。我希望问题符合规则。

4 个答案:

答案 0 :(得分:3)

我也会使用线程,但我只是想补充一点,看看java.util.concurrent.Executors(创建线程池,因为你有很多对象)和{{1和} java.util.concurrent.Future类允许您启动可以返回值的线程。

请查看concurrency tutorial了解详情。

答案 1 :(得分:1)

我建议您创建一个实现Runnable的类,其run方法执行示例中doThat()所做的操作。然后,您可以以一种简单的方式在单独的线程中调用它。 Java的Thread class确实有一个可运行的构造函数。使用runjoin方法。

干杯 的Matthias

答案 2 :(得分:1)

当然,线程是处理背景中某些工作的唯一解决方案,但是 您不会被迫仅使用一个线程来执行单个操作。 您只能使用一个维护操作队列的线程,其方式是每次调用方法都会将新条目添加到队列中。 也许像“策略”这样的设计模式可以帮助你概括要执行的操作的概念,以便将“操作对象”存储到线程的队列中。

答案 3 :(得分:1)

您希望同时执行多项操作,因此使用线程确实是可行的方法。 Java tutorial concurrency lesson可能会对您有所帮助。

1000个并发线程会产生大量内存负载,因为为每个线程分配了一定量的堆栈内存(2 MB?)。但是,如果您可以某种方式确保一次只运行一个Thread,那么您仍然可以采用每个对象的线程方法。这将要求您管理doThat()仅被调用,如果前调用在另一个对象上生成的线程已经完成。

如果你不能轻易确保,另一种方法是构造一个工作线程,该线程从double ended queue读取哪个对象。然后,doThat()方法只会将this添加到队列的末尾,工作线程稍后将从中提取它。从并发线程访问任何数据结构时,您必须正确同步。并且主线程应以某种方式通知工作线程的条件,它不会再向队列添加任何对象,因此工作线程可以干净地终止。