Java方法在线程中运行

时间:2010-02-18 21:00:56

标签: java multithreading

我理解线程背后的概念,并用其他语言编写线程,但我无法理解如何根据我的需要调整它们。

目前基本上我有一个对象向量,它们从文件中顺序读入。 然后该文件有一个事件列表,需要同时发生,等待一个事件完成,这需要20-30秒不是一个选项。

对象中只有几种处理这些事件的方法。但是,通过查看教程,对象必须扩展/实现线程/ runnable,但是如果对象在线程中,那么对该对象的方法调用似乎顺序发生。

我会很感激你的额外信息,因为我显然缺少一些我不太确定的东西!

总结一下如何使用线程执行单个方法?

4 个答案:

答案 0 :(得分:5)

要启动一个线程,请在start()的实例或其子类上调用Threadstart()方法立即返回 。同时,另一个线程(由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)

线程的关键是要记住每个必须运行的任务必须在自己的线程中。在同一线程中执行的任务将按顺序执行。将并发任务划分为不同的线程将允许您进行所需的并发处理。