class ThreadDemo extends Thread {
private Thread t;
private String threadName;
ThreadDemo( String name) {
threadName = name;
System.out.println("Creating " + threadName );
}
public void run() {
System.out.println("Running " + threadName );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// Let the thread sleep for a while.
Thread.sleep(50);
}
}catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo T1 = new ThreadDemo( "Thread-1");
T1.start();
ThreadDemo T2 = new ThreadDemo( "Thread-2");
T2.start();
}
}
此代码示例来自教程点多线程教程。 ThreadDemo类中定义的start()方法真的有必要吗?代码是否更清洁,如果删除?或者有什么我不理解的地方?
答案 0 :(得分:3)
我正在回答这个问题,因为我觉得我们都需要解释 这个例子的错误(它不仅显示了错误的例子MultiThreading,它也暴露了对面向对象编程缺乏理解)我们需要让你回到正确的学习路径。我的回答当然会回应你得到的其他评论。
class ThreadDemo extends Thread {
private Thread t;
[...Stuff...]
}
ThreadDemo实例是一个Thread实例(记得ThreadDemo扩展了Thread)。如果在其中嵌入Thread对象,则会生成两个不同的Thread实例。这是:
start()
,stop()
或任何内容可能不会以正确的方式影响包装的Thread实例对象(如果有的话)。多线程有时可能会让人迷失方向,你不需要任何这种混乱。
...并且可以拒绝整个示例,因为只有3行值得,而且它们与多线程进程无关。
Thread
和start
。这是您利用Java强大的内置库的地方。run()
方法让您的主题协同工作 - 您需要synchronization。答案 1 :(得分:0)
http://www.tutorialspoint.com/java/java_multithreading.htm
当我们通过实现Runnable接口执行多线程处理时,我们需要显式创建Thread类的对象。在实现Runnable接口的情况下,我们必须创建Thread对象。话虽如此,因为ThreadDemo类已经扩展了Thread,我们需要在start方法中执行它,而我们必须在实现Runnable时完成它。