Advertisement

Java中启动线程的start与run两种方式

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
本文探讨了在Java编程语言中启动线程的两种方法——使用start()和直接调用run()方法之间的区别及其应用场景。 在Java编程语言中启动线程主要有两种方法:一种是继承Thread类;另一种则是实现Runnable接口来创建线程对象。由于Java不支持多重继承,因此推荐使用后者。 通过start()与run()这两种方式可以初始化或开始执行一个新线程: - `start()` 方法用于开启一个新的独立运行的线程,并将该方法中的代码放入新的进程中去执行,这意味着当调用`start()`时,系统会创建一个全新的线程准备就绪等待CPU分配时间片来启动并进入run()方法中定义的任务。 - 相比之下,直接使用 `run()` 方法则更像是普通的方法调用。它不会生成额外的线程;相反,在当前执行流上下文中运行给定的代码块。这通常不是我们想要的效果,因为多线程编程的核心目标是并发地执行任务。 来看一个简单的例子来加深理解: ```java public class Test { public static void main(String[] args) { Thread t = new Thread(){ public void run() { pong(); } }; // 假设这里使用的是run() t.run(); System.out.println(ping); } static void pong() { System.out.println(pong); } } ``` 在这个例子中,如果调用`t.run()`而不是`t.start()`的话,那么先执行完线程中的代码(即打印pong),然后才会继续在主线程上输出“ping”。 但是,如果我们使用 `start()` 替换掉上述的 `run()`, 例如: ```java public class Test { public static void main(String[] args) { Thread t = new Thread(){ public void run() { pong(); } }; // 改为调用 start() t.start(); System.out.println(ping); } static void pong() { System.out.println(pong); } } ``` 那么程序输出结果将是“ping”后紧接着是pong, 因为`start()`方法会创建一个新线程,该线程立即准备运行(但并非马上执行),而main线程则继续向下执行。 关于 `start()` 和 `run()`, 它们在源码层面的区别在于:`start()` 方法被声明为同步的(synchronized),这意味着每次只能有一个线程调用它。这正是为什么它可以创建一个新的线程,而直接调用`run()`方法只是简单地执行代码块,并不会产生新的线程。 因此,在实际编程中选择使用哪种方式启动新线程应根据具体需求来决定。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • Java线startrun
    优质
    本文探讨了在Java编程语言中启动线程的两种方法——使用start()和直接调用run()方法之间的区别及其应用场景。 在Java编程语言中启动线程主要有两种方法:一种是继承Thread类;另一种则是实现Runnable接口来创建线程对象。由于Java不支持多重继承,因此推荐使用后者。 通过start()与run()这两种方式可以初始化或开始执行一个新线程: - `start()` 方法用于开启一个新的独立运行的线程,并将该方法中的代码放入新的进程中去执行,这意味着当调用`start()`时,系统会创建一个全新的线程准备就绪等待CPU分配时间片来启动并进入run()方法中定义的任务。 - 相比之下,直接使用 `run()` 方法则更像是普通的方法调用。它不会生成额外的线程;相反,在当前执行流上下文中运行给定的代码块。这通常不是我们想要的效果,因为多线程编程的核心目标是并发地执行任务。 来看一个简单的例子来加深理解: ```java public class Test { public static void main(String[] args) { Thread t = new Thread(){ public void run() { pong(); } }; // 假设这里使用的是run() t.run(); System.out.println(ping); } static void pong() { System.out.println(pong); } } ``` 在这个例子中,如果调用`t.run()`而不是`t.start()`的话,那么先执行完线程中的代码(即打印pong),然后才会继续在主线程上输出“ping”。 但是,如果我们使用 `start()` 替换掉上述的 `run()`, 例如: ```java public class Test { public static void main(String[] args) { Thread t = new Thread(){ public void run() { pong(); } }; // 改为调用 start() t.start(); System.out.println(ping); } static void pong() { System.out.println(pong); } } ``` 那么程序输出结果将是“ping”后紧接着是pong, 因为`start()`方法会创建一个新线程,该线程立即准备运行(但并非马上执行),而main线程则继续向下执行。 关于 `start()` 和 `run()`, 它们在源码层面的区别在于:`start()` 方法被声明为同步的(synchronized),这意味着每次只能有一个线程调用它。这正是为什么它可以创建一个新的线程,而直接调用`run()`方法只是简单地执行代码块,并不会产生新的线程。 因此,在实际编程中选择使用哪种方式启动新线程应根据具体需求来决定。
  • Java线startrun区别详解
    优质
    本文详细解析了在Java编程语言中,线程启动时使用start()和直接调用run()方法之间的区别。通过对比分析,帮助开发者理解为何推荐使用start()来创建并运行新线程。 本段落详细介绍了Java线程中start方法与run方法的区别,并通过示例代码进行了讲解,对学习或工作中遇到的相关问题具有参考价值。需要了解的朋友可以参考此内容。
  • Qt线start()run()
    优质
    本篇文章深入探讨了在使用Qt框架开发时,关于QThread类中的start()和run()两个关键方法的应用技巧及注意事项。帮助开发者更好地理解多线程编程。 线程之间可以共享数据但各自独立执行。QT中的QThread是平台无关的。通常从main函数开始运行主线程,并在其中创建其他线程,这些线程都是由QThread派生出来的。
  • 关于在Java创建线
    优质
    本文介绍了在Java编程语言中创建线程的两种主要方法:继承Thread类和实现Runnable接口。通过这两种方式,开发者可以轻松地在线程中执行代码。 在Java中创建线程有两种方法:使用Thread类或实现Runnable接口。如果选择后者,则需要建立一个Thread实例来执行实现了Runnable的代码。因此,不论是通过Thread类还是Runnable接口来创建线程,都需要基于Thread类或者其子类创建对象。
  • Java线返回线数据
    优质
    本文探讨了在Java多线程环境中获取和返回线程间数据的两种方法,并分析各自的优缺点及应用场景。 从线程中返回数据与向线程传递数据类似。同样可以通过类成员以及回调函数来实现这一目的。然而,在使用类成员进行数据的返回和传递时存在一些差异,具体细节如下:
  • Java实现CRC算法
    优质
    本文介绍了在Java编程语言中通过内置类和自定义实现两种方法来完成CRC(循环冗余校验)算法的应用与比较。 在JAVA环境下实现CRC(XMODEM)算法可以通过计算法和查表法两种方法来完成,并且需要编写验证代码以确保算法的正确性。
  • Pythonrun()start()函数区别和对比介绍
    优质
    本篇文章深入探讨了Python多线程编程中的两个重要方法——`run()`和`start()`之间的区别及其应用场景。通过详细的解释帮助读者理解何时以及如何使用这两个函数,以实现更高效的程序设计。 `run()` 方法并不启动一个新线程,在主线程中调用的是普通函数。而 `start()` 方法用于创建和运行一个新的子线程,并且这个子线程的名字就是你在定义的时候指定的name值。因此,如果你想实现多线程的功能,必须使用 `start()` 方法。 例如:如果在代码里使用`run()`方法来启动一个新线程的话,打印出来的线程名会是MainThread(即主线程)。下面是具体的例子: ```python import threading, time def worker(): count = 1 while True: if count >= 4: break time.sleep(1) count += 1 print(thread name =, threading.current_thread().name) # 使用run()方法启动线程,打印出的线程名是MainThread。 t = threading.Thread(target=worker, name=MyThread) t.run() ```
  • Java生成随机数
    优质
    本文介绍了在Java编程语言中实现随机数生成的两种主要方法,探讨了Random类和Math.random()函数的特点及应用场景。 在Java中生成随机数的方法包括数字随机、字符随机以及指定范围内的随机数等代码示例。
  • 解析AndroidSplash态切换
    优质
    本文详细介绍了在Android开发中实现Splash启动图动态切换的两种方法,旨在帮助开发者优化应用启动体验。 冷启动的时候会因为网络原因,默认显示一张本地图片。热启动的时候则根据获取的启动图是否为新动态来进行替换。以下是实现动态替换的两种方式: 1. 使用Glide库中的缓存下载功能,通过`downloadOnly`方法可以单独完成图片的下载任务。 2. 也可以使用Retrofit配合RxJava来执行网络请求并订阅结果,在这里我们利用Observable进行异步操作: ```java Observable.just(RetrofitHelper.API_BASE_URL + img) .subscribeOn(Schedulers.newThread()) .subscribe(new Action1() { @Override public void call(String s) { // 处理下载完成后的逻辑 } }); ``` 以上两种方式都可以有效地实现启动图的动态替换功能。