摘自:http://blog.csdn.net/xuxurui007/article/details/7685076
java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。
在Java当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。
第一是创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
第二是就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
第五是死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
实现并启动线程有两种方法
1、写一个类继承自Thread类,重写run方法。用start方法启动线程
2、写一个类实现Runnable接口,实现run方法。用new Thread(Runnable target).start()方法来启动
多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。
调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run,这么麻烦,为了不直接调用run?就是为了实现多线程的优点,没这个start不行。
1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
记住:多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发
- public class Test {
- public static void main(String[] args) {
- Runner1 runner1 = new Runner1();
- Runner2 runner2 = new Runner2();
- // Thread(Runnable target) 分配新的 Thread 对象。
- Thread thread1 = new Thread(runner1);
- Thread thread2 = new Thread(runner2);
- // thread1.start();
- // thread2.start();
- thread1.run();
- thread2.run();
- }
- }
- class Runner1 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
- public void run() {
- for (int i = 0; i < 100; i++) {
- System.out.println("进入Runner1运行状态——————————" + i);
- }
- }
- }
- class Runner2 implements Runnable { // 实现了Runnable接口,jdk就知道这个类是一个线程
- public void run() {
- for (int i = 0; i < 100; i++) {
- System.out.println("进入Runner2运行状态==========" + i);
相关推荐
在Java多线程编程中,`Thread` 类的 `run()` 方法和 `start()` 方法扮演着不同的角色,它们之间的区别是理解并发执行的关键。 首先,`start()` 方法是真正启动新线程的方法。当你调用 `Thread` 对象的 `start()` ...
t.start(); setContentView(R.layout.activity_main); System.out.println("Activity-->"+ Thread.currentThread().getId()); System.out.println("Activity-->"+ Thread.currentThread().getName()); }...
start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。 run() : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动...
在Java编程语言中,理解和掌握线程的使用是至关重要的,特别是`Thread.start()`和`Thread.run()`这两个方法。它们在多线程编程中扮演着关键角色,但有着明显的区别。 首先,`Thread.start()`方法的主要作用是启动一...
Java线程中的`run()`和`start()`方法是线程编程中的关键概念,它们之间有着显著的区别。首先,我们来看一下这两个方法的基本解释。 1. `start()`方法:`start()`是真正启动线程的关键,它使得线程进入就绪(可运行...
`Thread`类是Java中用于创建和管理线程的核心类,而`start()`和`run()`方法是与线程执行密切相关的方法,它们之间存在显著的区别。 首先,`run()`方法是`Runnable`接口或`Thread`类中的一个成员方法。当你需要创建...
在Java多线程编程中,理解`Thread`类的`start()`和`run()`方法的区别至关重要。这两个方法在实现线程并发执行时起到不同的作用。 首先,`start()`方法是用于启动一个新的线程。当你调用`start()`方法时,Java虚拟机...
### QT线程start()与run()详解 #### 一、QT线程概述 在QT框架中,线程处理是一项非常重要的功能。QT提供了一个跨平台的解决方案——`QThread`类,使得开发者能够轻松地创建多线程应用程序,而无需担心底层操作系统...
本文将深入探讨`start()` 和 `run()` 方法的区别及其在多线程环境中的作用。 1. **start() 方法** `start()` 方法是启动线程的关键。当你调用 `Thread` 对象的 `start()` 方法时,Java虚拟机(JVM)会执行以下几...
Java线程中start和run的区别详解 在Java编程中,线程是一个基础概念,start和run是两个常用的方法,但是它们之间的区别却经常被忽视。本文将详细介绍Java线程中start和run的区别,通过示例代码帮助大家更好地理解这...
第一点,start()方法和run()方法的区别。在Java中,start()方法是用于启动线程的方法,而run()方法是线程的主体,即真正的逻辑所在。start()方法调用run()方法,使线程进入就绪状态,使线程所代表的虚拟处理机处于可...
在理解Thread类的start()和run()方法的区别时,我们需要深入探讨它们的工作原理。 首先,start()方法的主要作用是启动一个新的线程并执行该线程的run()方法。当调用start()时,Java虚拟机(JVM)会执行线程的初始化...
以下是一些关于`start`与`run`方法的关键区别: - **线程创建**:`start`方法会创建一个新的线程,而`run`方法不会。 - **并发执行**:`start`方法使得`run`方法在新线程上并发执行,而`run`方法在当前线程上顺序...
在QT中,每个线程都有一个与之关联的事件循环,而`run()`函数是线程执行的主要入口点,我们在其中编写线程执行的具体逻辑。`run()`函数不同于普通的函数调用,它是在线程上下文中执行的,因此可以实现并发操作。 ...
在Java编程语言中,多线程是并发...在这个练习中,我们学习了如何通过继承`Thread`、重写`run`方法以及启动线程来实现从1到100的累加。这只是一个基础的示例,实际的多线程编程会涉及到更复杂的并发控制和同步策略。
在Python的多线程编程中,`run()`和`start()`是两个非常关键的方法,它们在处理线程执行方面有着显著的区别。理解这两个方法的工作原理对于编写高效的并发程序至关重要。 首先,`run()`方法并不是用来启动线程的,...
面试中常见的问题在于理解`start()`方法与`run()`方法的区别。这里我们将详细探讨这两个方法以及它们在Java线程中的作用。 首先,`start()`方法是开启新线程的关键,而`run()`方法则是线程执行的具体任务。当你调用...
接下来,我们来看`start`和`run`方法的区别。`start`方法是用于启动线程的关键,它是一个同步方法,确保线程不会在未准备好时启动。在`start`方法内部,它首先检查线程的状态,如果线程已经启动或已经终止,就会抛出...
与标准C++库中的std::thread不同,QThread有自己的事件循环,使得线程可以处理信号和槽,这使得在QT环境中使用多线程更加方便和灵活。 二、QThread的创建 创建QThread对象时,通常会继承QThread并重写run()方法。...
### 多线程的Runnable与Thread的区别 在Java中实现多线程有两种主要方式:一种是继承`Thread`类;另一种是实现`Runnable`接口。本文将深入探讨这两种方法的区别,帮助初学者更好地理解并选择适合场景的多线程实现...