[英]Confusing multi threading example
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()方法真的必要吗? 如果将其删除,代码是否更干净? 还是这里有些我不理解的东西?
我在做这样的一个答案,因为我觉得我们都需要解释 什么是错的例子 ( 它不仅显示出多线程一个坏榜样,但也暴露出缺乏面向对象编程的理解 ),我们需要把您回到正确的学习道路 。 我的回答当然会回应您收到的其他评论。
class ThreadDemo extends Thread {
private Thread t;
[...Stuff...]
}
ThreadDemo实例是 Thread实例(请记住ThreadDemo扩展了Thread)。 如果在其中嵌入一个Thread对象,则将产生两个不同的Thread实例。 这是 :
start()
, stop()
或任何东西,可能根本不会以正确的方式影响被包装的Thread实例对象。 多线程有时会让人迷失方向,您无需费神。
...并且整个示例都可以被拒绝,因为几乎没有3行值得,而且它们与多线程处理无关。
Thread
并start
它们。 在这里,您可以利用Java强大的内置库。 run()
方法上一起工作-您将需要同步 。 http://www.tutorialspoint.com/java/java_multithreading.htm
当我们通过实现Runnable接口执行多线程时,需要显式创建Thread类的对象。 在实现Runnable接口的情况下,我们必须创建Thread对象。 话虽如此,由于ThreadDemo类已经在其中扩展了Thread,因此我们需要在start方法中进行操作,而在实现Runnable时必须进行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.