Java多线程 - 最佳实践

时间:2013-06-10 07:07:36

标签: java multithreading performance

我无法理解教师的多线程方法。好吧,在展示我们的两个例子之前,我必须说他正在教一些新手(包括我,我猜^。^)所以他可能选择了一种易于理解的多线程方法。另外,我没有参观他的课程,但我的剧本中写着以下内容:

他正在做这样的多线程:

class MyThread implements Runnable {

Thread t;

MyThread() {

    t = new Thread(this, "Demo");
    t.start();
}

public void run() {

    try {

        for (int i = 5; i > 0; i--) {

            System.out.println("Child-Thread:" + i);
            Thread.sleep(1000);
        }
    } catch (InterruptedException e) {
        System.out.println("Child interrupted");
    }
    System.out.println("Child finished");
}

}

我觉得这样做比较干净:

public class Aufg1 {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub

    MyThread t1 = new MyThread(1);

    ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
    executor.schedule(t1, 1, TimeUnit.SECONDS);
}

static class MyThread implements Runnable {

    int number;

    public MyThread(int number) {
        this.number = number;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for (int i = 5; i > 0; i--) {
            System.out.println("Thread " + number + ": " + i);
        }
    }


}
}

不要理会我为什么使用5号线程池。我需要它进行另一项练习。此外,我可以使用ThreadPool进行单次执行就是这个例子。

有很大的不同吗?有更清洁的方式吗?我知道还有其他一些多线程的方法,虽然我只在这里展示了一个。

谢谢!

3 个答案:

答案 0 :(得分:8)

我不会将runnable类命名为名称中带有线程的东西,这有点令人困惑。

除此之外,您正在使用java并发包,他正在使用构建此包的较低级别的线程类。可能是因为在学会如何跑步之前必须学会走路。 :)

答案 1 :(得分:3)

线程有很多实现,是最简单的Thread本身,是runnable的基本实现。我想他的观点只是了解Thread是什么;在你的职业生涯中,你需要线程作为工具,你需要知道它的内部工作,然后使用适合你的最佳实现。

执行程序和线程都将创建一个或多个(在执行程序的情况下)通常使用Executor而不是显式创建线程。 *

无论如何,作为个人建议,我建议您继续关注使用线程的新方法,因为每个实现对于不同的问题都会更好。

答案 2 :(得分:3)

作为一个为初学者教授多线程的人,我不得不承认我(至少有一次)因编写不优雅的代码而犯了罪,以证明这一点。

这个例子似乎是以人为的方式证明了睡眠方法的作用 - 你的代码没有。你的老师应该在他们的代码中加入一些解释。

  

有很大的不同吗?有更清洁的方式吗?我知道   还有其他一些多线程的方法,尽管我只是   在这里展示了一个。

这取决于你想要达到的目标。正如其他人所说,有许多不同的方法可以进行多线程处理。代码的行为略有不同,因此存在差异 - 但这并不意味着曾经“更清洁”。由于这是一个人为的例子(数到5),我们无法真正说出“最干净”或“最佳”方法是什么。