2

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

他正在做这样的多线程:

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 进行单次执行,就是这个例子。

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

谢谢!

4

3 回答 3

8

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

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

于 2013-06-10T07:16:14.063 回答
3

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

这个例子似乎展示了 sleep 方法以一种人为的方式做了什么——你的代码没有。您的老师可能应该在他们的代码中包含一些解释。

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

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

于 2013-06-10T08:30:04.053 回答
3

线程的实现有很多,最简单的就是线程本身,runnable的基本实现。我想他的意思只是了解线程是什么;在您的职业生涯中,您将需要线程作为一种工具,并且您需要了解其内部工作原理,然后使用适合您的最佳实现。

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

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

于 2013-06-10T07:17:11.850 回答