我理解线程背后的概念,并用其他语言编写线程,但我无法理解如何根据我的需要调整它们。
目前基本上我有一个对象向量,它们从文件中顺序读入。 然后该文件有一个事件列表,需要同时发生,等待一个事件完成,这需要20-30秒不是一个选项。
对象中只有几种处理这些事件的方法。但是,通过查看教程,对象必须扩展/实现线程/ runnable,但是如果对象在线程中,那么对该对象的方法调用似乎顺序发生。
我会很感激你的额外信息,因为我显然缺少一些我不太确定的东西!
总结一下如何使用线程执行单个方法?
答案 0 :(得分:5)
要启动一个线程,请在start()
的实例或其子类上调用Thread
。 start()
方法立即返回 。同时,另一个线程(由Thread
实例构成的线程)起飞,继续执行run()
实例的Thread
方法。
管理线程并不像看起来那么容易。要获得更流畅的API,请尝试使用Executor
(请参阅java.util.concurrent
中的类)。
答案 1 :(得分:2)
在Java中做的最好的事情是创建另一个类,该类接收您需要处理的数据并执行您需要执行的任何操作:
class Worker implements Runnable{
Object mydata;
Worker(Object data)
{
mydata = data;
}
@override
void run()
{
//process the data
System.out.println(data.toString());
//or if you want to use your class then:
YourClass yc = (YourClass)myData;
yc.methodB();
}
}
class YourClass
{
private final ExecutorService executor = Executors.newCachedThreadPool();
private ArrayList<Object> list;
YourClass()
{
list = new ArrayList<Object>();
list.add(new Object());
...
...
list.add(new Object());
}
void methodA()
{
for(Object item : list )
{
// Create a new thread with the worker class taking the data
executor.execute(new Worker(item));
}
}
void methodB(){/*do something else here*/}
}
请注意,您可以传递需要调用方法的实际类,而不是获取数据:
executor.execute(new Worker(new MyClass()));
在Worker类的run方法中,您调用MyClass上需要调用的任何内容...执行程序创建一个新线程并在您的Worker上调用run。每个Worker将在一个单独的线程中运行,它将是并行的。
答案 2 :(得分:1)
托马斯已经提供了技术细节。我将尝试着重于逻辑。
以下是我对您的问题的理解建议。
假设你有一个X类型的对象集合(或者甚至是不同类型的混合)。您需要根据指定的某个事件在这些对象中调用方法foo和/或bar。所以现在,你可能有第二个收藏品来储存那些。
所以我们有两个List对象(一个用于X对象,另一个用于事件)。
现在,我们有一个函数execute,它将接受X和事件,并调用foo或bar。该执行方法可以包装在线程中,并同时执行。这些线程中的每一个都可以从列表中获取一个对象,递增计数器,并执行foo / bar。完成后,检查计数器,然后从列表中选择下一个。您可以在列表中使用5个或更多这些线程。
因此,正如我们所见,来自文件的对象不必是Thread对象。
您必须非常小心List和计数器是同步的。更好的数据结构是可能的。为了便于理解,我坚持粗略的。
希望这会有所帮助。
答案 3 :(得分:0)
线程的关键是要记住每个必须运行的任务必须在自己的线程中。在同一线程中执行的任务将按顺序执行。将并发任务划分为不同的线程将允许您进行所需的并发处理。