这是作业。
我不想要解决方案,只需要少量的链接或想法。
简单地说我想做的是,
简单示例:
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。但请只是一个链接将是伟大的。
提前致谢。我希望问题符合规则。
答案 0 :(得分:3)
我也会使用线程,但我只是想补充一点,看看java.util.concurrent.Executors
(创建线程池,因为你有很多对象)和{{1和} java.util.concurrent.Future
类允许您启动可以返回值的线程。
请查看concurrency tutorial了解详情。
答案 1 :(得分:1)
我建议您创建一个实现Runnable
的类,其run
方法执行示例中doThat()
所做的操作。然后,您可以以一种简单的方式在单独的线程中调用它。 Java的Thread
class确实有一个可运行的构造函数。使用run
和join
方法。
干杯 的Matthias
答案 2 :(得分:1)
当然,线程是处理背景中某些工作的唯一解决方案,但是 您不会被迫仅使用一个线程来执行单个操作。 您只能使用一个维护操作队列的线程,其方式是每次调用方法都会将新条目添加到队列中。 也许像“策略”这样的设计模式可以帮助你概括要执行的操作的概念,以便将“操作对象”存储到线程的队列中。
答案 3 :(得分:1)
您希望同时执行多项操作,因此使用线程确实是可行的方法。 Java tutorial concurrency lesson可能会对您有所帮助。
1000个并发线程会产生大量内存负载,因为为每个线程分配了一定量的堆栈内存(2 MB?)。但是,如果您可以某种方式确保一次只运行一个Thread,那么您仍然可以采用每个对象的线程方法。这将要求您管理doThat()
仅被调用,如果前调用在另一个对象上生成的线程已经完成。
如果你不能轻易确保,另一种方法是构造一个工作线程,该线程从double ended queue读取哪个对象。然后,doThat()
方法只会将this
添加到队列的末尾,工作线程稍后将从中提取它。从并发线程访问任何数据结构时,您必须正确同步。并且主线程应以某种方式通知工作线程的条件,它不会再向队列添加任何对象,因此工作线程可以干净地终止。