问题描述
|
这是我的问题:
我有一堆相同的对象。这些对象与服务器接口。由于服务器速度较慢,因此需要4到5秒钟才能从服务器获取数据。
现在,我需要所有对象来获取数据。所以我为每个对象调用MyObject.getData()。我可以按系列进行此操作,但是20个对象(每个对象花费5秒钟)太慢了。我以为我应该使用线程并将每个对象放在自己的线程上。
这是我的问题:
如果我使对象扩展线程。将调用o MyObject.getData();运行在该对象的线程中,还是在调用该方法的线程中运行?我知道我可以使用Thread.Run()来使对象运行,但这不是我想要的。我想让方法随意运行。
那我该怎么做呢?
非常感谢。
解决方法
教科书上的方法可能是这样的:
class GetDataObj implements Callable<Data> {
public Data call(){
//get data
return data;
}
}
然后
ExecutorService exec = Executors.newCachedThreadPool();
Set<Callable<Data>> objects = //get objects;
List<Future<Data>> futures = exec.invokeAll(objects);
for(Future<Data>> future : futures){
Data data = future.get();
//do stuff with data
}
exec.shutdown();
请注意,当您遍历futures
时,get()
方法将阻塞,直到结果可用于DataObj
。如果您想等到所有数据都可用,就可以了。
, 如果调用object.myMethod(),则该方法将在调用者线程中运行。
您必须启动线程以使其运行,而不是调用run()方法。
您可以做的是重写对象,以便myMethod()方法启动新线程。因此,您可以使用与实际完全相同的对象。但是,如果myMethod返回某事,则该更改,因为您必须等待线程终止之前,
, 我认为最好使用线程池从对象中获取数据。因此,您将需要每个对象来实现Runnable。请参阅线程池。
如果在对象获得数据后将对队列的引用传递给它们,则可以将其放入队列中。然后,主线程可以在就绪后将数据从队列中移出。
参见生产者-消费者模式。
例如:
BlockingQueue<Data> queue = new BlockingQueue<Data>();
ExecutorService pool = Executors.newFixedThreadPool(5);
//implements Runnable,getting data from this
//places Data object in queue instead of returning it
DataObject obj = new DataObject(queue);
pool.execute(obj); //invokes the run method of the DataObject
Data data = queue.take();
您需要为多个对象建立一个for循环。
希望这可以帮助。