Java 混乱的多线程示例
此代码示例来自教程点多线程教程。类ThreadDemo中定义的start()方法真的有必要吗?如果代码被删除,代码会更干净吗?还是有什么我不明白的地方?Java 混乱的多线程示例,java,multithreading,Java,Multithreading,此代码示例来自教程点多线程教程。类ThreadDemo中定义的start()方法真的有必要吗?如果代码被删除,代码会更干净吗?还是有什么我不明白的地方? 当我们通过实现Runnable接口执行多线程时,需要显式地创建Thread类的对象。在实现可运行接口的情况下,我们必须创建线程对象。话虽如此,由于ThreadDemo类已经扩展了Thread,我们需要在start方法中进行扩展,而我们必须在实现Runnable时进行扩展。我之所以回答这个问题,是因为我觉得我们都需要解释一下示例中的错误所在(这不
当我们通过实现Runnable接口执行多线程时,需要显式地创建Thread类的对象。在实现可运行接口的情况下,我们必须创建线程对象。话虽如此,由于ThreadDemo类已经扩展了Thread,我们需要在start方法中进行扩展,而我们必须在实现Runnable时进行扩展。我之所以回答这个问题,是因为我觉得我们都需要解释一下示例中的错误所在(这不仅显示了多线程的一个坏例子,还暴露了对面向对象编程的理解不足)我们需要让您回到正确的学习道路上。我的回答当然会与您得到的其他评论相呼应 第一件非常非常错误的事情是: ThreadDemo实例是一个线程实例(请记住ThreadDemo扩展了Thread)。如果在其中嵌入Thread对象,则会生成两个不同的线程实例。这是:
- 浪费(不需要两个实例,只需要一个线程实例
- 令人困惑(哪个实例真正“重要”?哪个实例正在运行?)
- 由于副作用,将以错误结束。实际上,调用包装线程演示实例上的
、start()
或任何操作都可能不会以正确的方式影响包装线程实例对象(如果有的话)stop()
以下是了解这一点的途径:
线程
s和启动它们
run()
方法上协同工作-您需要这样做这是一个可怕的代码。我建议你找到另一个可以学习的资源。你是正确的:
start
方法(应该标记为@Override
)在这里,除了这两个成员变量之外,没有任何作用:线程
不需要线程
,它已经允许您设置名称。您不应该过度控制线程的run()
,并且绝对不应该重写start()
如果您知道自己在做什么。在这种情况下,您可以将扩展线程
替换为实现可运行的
类的一个可怕之处是它既扩展了线程
,又有一个线程
作为字段。我们怎么能不混淆哪个线程是哪个线程?尤其是such是这个领域的一个没有信息的名字。现在放弃这个教程。阅读Oracle的教程。你会知道它不是由一个对自己的技能有错觉的人写的。
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();
}
}
class ThreadDemo extends Thread {
private Thread t;
[...Stuff...]
}