我无法理解教师的多线程方法。好吧,在展示我们的两个例子之前,我必须说他正在教一些新手(包括我,我猜^。^)所以他可能选择了一种易于理解的多线程方法。另外,我没有参观他的课程,但我的剧本中写着以下内容:
他正在做这样的多线程:
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进行单次执行就是这个例子。
有很大的不同吗?有更清洁的方式吗?我知道还有其他一些多线程的方法,虽然我只在这里展示了一个。
谢谢!
答案 0 :(得分:8)
我不会将runnable类命名为名称中带有线程的东西,这有点令人困惑。
除此之外,您正在使用java并发包,他正在使用构建此包的较低级别的线程类。可能是因为在学会如何跑步之前必须学会走路。 :)
答案 1 :(得分:3)
线程有很多实现,是最简单的Thread本身,是runnable的基本实现。我想他的观点只是了解Thread是什么;在你的职业生涯中,你需要线程作为工具,你需要知道它的内部工作,然后使用适合你的最佳实现。
执行程序和线程都将创建一个或多个(在执行程序的情况下)通常使用Executor而不是显式创建线程。 *
无论如何,作为个人建议,我建议您继续关注使用线程的新方法,因为每个实现对于不同的问题都会更好。
答案 2 :(得分:3)
作为一个为初学者教授多线程的人,我不得不承认我(至少有一次)因编写不优雅的代码而犯了罪,以证明这一点。
这个例子似乎是以人为的方式证明了睡眠方法的作用 - 你的代码没有。你的老师应该在他们的代码中加入一些解释。
有很大的不同吗?有更清洁的方式吗?我知道 还有其他一些多线程的方法,尽管我只是 在这里展示了一个。
这取决于你想要达到的目标。正如其他人所说,有许多不同的方法可以进行多线程处理。代码的行为略有不同,因此存在差异 - 但这并不意味着曾经“更清洁”。由于这是一个人为的例子(数到5),我们无法真正说出“最干净”或“最佳”方法是什么。