如何覆盖java中的thread.start()方法?

Ana*_*and 5 java multithreading

我需要在我的java代码中实现thread.start()方法.请通过覆盖thread.start()方法以及它如何工作的示例告诉我?

Sch*_*jer 14

你不应该.改为覆盖运行


Hen*_*ing 13

正如其他人所说,压倒Thread.start()不是这样做的方式.通常,我也不会覆盖Thread.run(),但使用a Runnable.

如果你必须决定在生成线程后运行哪种方法,你可以这样做:

final Runnable runnableA = ...;
final Runnable runnableB = ...;

Runnable r = new Runnable() {
    @Override
    public void run() {
        if (...) {
            runnableA.run();
        } else {
            runnableB.run();
        }
    }
}

Thread thread = new Thread(r);
thread.start();
Run Code Online (Sandbox Code Playgroud)

如果,如你所说,你有一个超类和子类,其中run()方法被覆盖,你可以只依赖后期绑定,并自动调用适当的方法:

Runnable couldBeAOrB = ...;
Thread thread = new Thread(couldBeAOrB);
thread.start();
Run Code Online (Sandbox Code Playgroud)


use*_*421 11

您可以start像任何其他方法一样覆盖

    Thread myThread = new Thread() {

        @Override
        public void start() {
            // do something in the actual (old) thread
            super.start();
        }

        @Override
        public void run() {
            // do something in a new thread if 'called' by super.start()
        }
    };
Run Code Online (Sandbox Code Playgroud)

但你必须调用super.start()创建一个新线程并run()调用该新线程.原版start做了一些你几乎无法模仿的魔法(本机代码).

如果run()直接从您的start()(或任何其他方法)中调用,它将作为普通方法在实际线程中执行,而不是在新线程中执行.如果您不想在新线程中运行某些代码,则没有理由使用Thread.

您必须将您的决策逻辑放在run()方法中,start如果真的需要,可以在构造函数(或其他方法,最终)中使用一些变量集.我找不到任何需要这个变量的理由,它应该足以run()像其他地方已经建议的那样测试条件.

    class MyThread extends Thread {

        private final boolean flag;

        public MyThread(boolean someCondition) {
            flag = someCondition;
        }

    // alternative  
    //    @Override
    //    public synchronized void start() {
    //        flag = <<someCondition>>
    //        super.start();
    //    }

        @Override
        public void run() {
            if (flag) {
                // do something like super.run()
            } else {
                // do something else
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是如果你像@Henning建议的那样去理解和维护会更容易!
它也是一个更面向对象的解决方案......