在Java中对线程使用method

问题描述

| 这是我的问题: 我有一堆相同的对象。这些对象与服务器接口。由于服务器速度较慢,因此需要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循环。 希望这可以帮助。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...