如果我们在 start 方法而不是 run 方法中执行整个 Thread 功能会发生什么?

当然

如果我们在 start 方法而不是 run 方法中执行整个 Thread 功能会发生什么? 下面的代码运行方式与我在 run 方法中添加代码时的运行方式相同。

   public class RunMethodTest extends AppCompatActivity {


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Abc abc=new Abc();
        abc.start();
    }
}

class Abc extends Thread
{
    @Override
    public synchronized void start() {
        super.start();
        for(int i=0;i<10;i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread" + " " + i);
        }
    }
}
充满鳗鱼的气垫船

测试它:让你的代码告诉你它正在被哪个线程调用

  1. 通过获取当前线程 Thread.currentThread()
  2. 然后通过getId()and获取当前线程的 id 和 namegetName()

public class ThreadTest {
    public static void main(String[] args) {
        Thread currentThread = Thread.currentThread();
        System.out.printf("Main, Which Thread: %s, %d%n", 
                currentThread.getName(), 
                currentThread.getId());

        Abc abc = new Abc();
        abc.start();
    }
}

class Abc extends Thread {
    @Override
    public synchronized void start() {
        super.start();

        Thread currentThread = Thread.currentThread();
        System.out.printf("Start, Which Thread: %s, %d%n", 
                currentThread.getName(), 
                currentThread.getId());

        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread" + " " + i);
        }
    }

    @Override
    public void run() {
        super.run();

        Thread currentThread = Thread.currentThread();
        System.out.printf("Run, Which Thread: %s, %d%n", 
                currentThread.getName(), 
                currentThread.getId());
    }
}

对我来说,这会返回:

Main, Which Thread: main, 1
Start, Which Thread: main, 1
Run, Which Thread: Thread-0, 9
Thread 0
Thread 1
Thread 2
Thread 3
....

这证明您的 Abc 的 start 方法(如预期)是在与调用代码相同的线程中调用的,而不是在新线程中调用的,并且只有该run()方法中的代码在新线程中被调用。如上所述,您几乎不需要或不想扩展 Thread,而是实现 Runnable 或 Callable。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们不能在Thread对象的同一实例上两次调用start方法?

我调用Thread.start()时如何调用run()方法?

当我们不等待异步方法时会发生什么

当我们在方法内部创建锁(同步块)对象时会发生什么?

如果我们在App Delegate中的didFinishLaunching中返回NO,会发生什么情况

如果我们在API中不使用DTO,会发生什么?

如果我在 dockerfile 中编写 RUN node index.js 而不是 CMD node index.js 会发生什么?

如果我使用 new Task(action) -> .Start() 而不是 Task.Run() 创建它,为什么 Task 在调用任何异步方法时停止执行?

如果我们在Java多线程中的executorService执行调用中传递线程,会发生什么情况

如果 start 不是从 0 开始,我们是否需要从 SUBSTRING 长度中删除一些字符?

如果有简单的方法,为什么我们需要reactjs-bootstrap?

如果我们仅在类中重写hashCode()并在Set中使用它会发生什么?

如果我们在8051的进位寄存器中存储一个值,将会发生什么?

如果我们不订阅HttpClient请求,该请求返回angular中的observables,会发生什么情况

我们可以在方法内部创建IIB(实例初始化块)吗?如果我们不能为什么不给出编译时错误呢?

如果我们可以使用访问器访问私有数据成员,那么为什么我们不能访问私有方法呢?

什么时候调用Java的thread.run()而不是thread.start()?

请解释Thread run()和start()方法的输出

当我们拥有currentThread()方法时,为什么Thread类具有静态方法?

如果字符文字总是 int 类型,为什么我们在 C 中有 char 类型?C 中的整个 char 类型不是多余的吗?

如果不在EMU8086中添加start:和end start,会发生什么?

在OCaml中,我们为什么有'+。','-。' 但是我们仅使用“ <”而不是“ <。”?

我们是否需要比静态工厂方法更喜欢构造函数?如果是这样,什么时候?

如果我们有太多的csv文件,有什么方法可以动态获取r平方值或使用循环?

如果我们只能编辑函数的主体,那么找到最多四个数字的最快方法是什么?

为什么我们需要实现接口以提供某些功能,而不是仅定义方法而不实现接口?

如果我们在Unix中的pthread_cleanup_push和pthread_cleanup_pop之间返回,将会发生什么?又为什么呢?

我们什么时候使用 forEach 方法而不是 for 循环?

当我们尝试设置当前执行代码的寄存器时会发生什么?