2

我们永远不应该重写线程的 start 方法,这很安静,但是当我对两种不同的行为感到困惑时,我只是在练习 java .....我正在尝试重写 Thread 类的 start 方法。下面是代码:

package myPackage;

public class MainThreadUsingThread extends Thread{  
    @Override  
    public void run() {  
        System.out.println("-run   in t1");  
        System.out.println("");  
    }  
    @Override  
    public void start() {

        System.out.println("in start in t1");
        super.start();
    }

    /*public static void main(String[] args) {
        System.out.println("hii");
        Thread t3=new Thread(new MainThreadUsingThread());
        t3.start();
    }*/
}

class A11 {  
    public static void main(String[] args) {  
        System.out.println("hii");  
        Thread t1=new Thread(new MainThreadUsingThread());  
        t1.start();
        Thread t2=new Thread() {
            @Override
            public void run() {  
                System.out.println("run in t2");  
            }  
            @Override
            public void start() {

                System.out.println("in start in t2");
                super.start();
            }
        };
        t2.start();
    }
}

在线程“t2”的情况下,我得到了覆盖的启动方法,但在线程“t1”的情况下却没有。请帮助我摆脱这种困惑。

在可运行接口的情况下,还有什么方法可以做同样的事情(覆盖,只要它不是一个好习惯)。

4

4 回答 4

4

当你写:

Thread t1=new Thread(new MainThreadUsingThread());

您将MainThreadUsingThread对象用作 Runnable,而不是 Thread(Thread 实现 Runnable),并且它的 start 方法永远不会被调用。

如果你写:

Thread t1 = new MainThreadUsingThread();

你应该得到你所期望的。

于 2013-01-18T11:01:54.430 回答
1
Thread t1=new Thread(new MainThreadUsingThread());

new MainThreadUsingThread()被用作Runnable(因为Thread工具Runnable)。线程执行Runnable.run(),这就是你没有得到覆盖的原因start

Thread.start被调用时,它会启动一个新线程并调用Thread.run该新线程。

你应该做这个:

Thread t1=new MainThreadUsingThread();

Thread中,其run方法启动Runnable用于构造 that 的 that Thread,或者如果Runnable使用 no 构造它,则不执行任何操作。如果您 extendsThread和 override Thread.run,这有效地改变了线程的作用。

如果使用new Thread(new MainThreadUsingThread()),这将有效地调用构造函数Thread(Runnable target)并构造一个新的Thread. 就像这样做:

Thread t1=new Thread((Runnable)(new MainThreadUsingThread()))
于 2013-01-18T11:02:14.900 回答
1

你写Thread t1=new Thread(new MainThreadUsingThread());的 t1 不是MainThreadingUsingThread. 它只是调用start()new 的方法,然后Thread调用.run()MainThreadUsingThread

于 2013-01-18T11:05:06.850 回答
0

关于你的第二个问题:

扩展 Thread 类不是最佳实践。而是使用Runnable接口,即

Thread myThread = new Thread(new Runnable(){
   @Override
   public void run(){
   }
});

当然,这也不是最好的方法。我真的建议你看看 ExecutorService。这包含诸如池之类的东西,因此不会每次都创建新线程。您只需提交作业即可完成。

它还支持 Futures 之类的东西,如果使用得当,它会生成非常优雅的代码。

于 2013-01-18T11:08:23.493 回答