启动线程肯定要用start()方法。当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。当cpu分配给它时间时,才开始执行run()方法(如果有的话)。start()是方法,它调用run()方法.而run()方法是你必须重写的. run()方法中包含的是线程的主体。
继承Thread类的启动方式:
public class ThreadStartTest {
public static void main(String[] args) {
ThreadTest tt = new ThreadTest();// 创建一个线程实例
tt.start(); // 启动线程
}
}
实现Runnable接口的启动方式:
public class RunnableStartTest {
public static void main(String[] args) {
Thread t = new Thread(new RunnableTest()); // 创建一个线程实例
t.start(); // 启动线程
}
}
实际上这两种启动线程的方式原理是一样的。首先都是调用本地方法启动一个线程,其次是在这个线程里执行目标对象的run()方法。那么这个目标对象是什么呢?为了弄明白这个问题,我们来看看Thread类的run()方法的实现:
public void run() {
if (target != null) {
target.run();
}
}
当我们采用实现Runnable接口的方式来实现线程的情况下,在调用new Thread(Runnable target)构造器时,将实现Runnable接口的类的实例设置成了线程要执行的主体所属的目标对象target,当线程启动时,这个实例的 run()方法就被执行了。当我们采用继承Thread的方式实现线程时,线程的这个run()方法被重写了,所以当线程启动时,执行的是这个对象自身的 run()方法。总结起来就一句话,如果我们采用的是继承Thread类的方式,那么这个target就是线程对象自身,如果我们采用的是实现Runnable接口的方式,那么这个target就是实现了Runnable接口的类的实例。
分享到:
相关推荐
- **2.1 线程启动**: 使用`start()`方法启动一个线程。这将导致调用该线程的`run()`方法。 - **2.2 线程执行**: 实际上执行的是`run()`方法中的代码。这是一个虚函数,必须在子类中重新实现。 - **2.3 线程退出**: ...
当调用 `ta.start()` 时,输出的结果可能是 "Thread-0"(新线程的名字)和 "main"(主线程的名字),因为 `start()` 启动了一个新线程执行 `run()` 方法,而 `main` 方法继续执行。而如果调用 `ta.run()`,由于没有...
如果我们直接调用 run() 函数,而不是调用 start() 函数,那么所有的线程将共享同一个调用堆栈,从而导致线程的执行顺序和结果不可预测。 例如,在上面的代码中,如果我们直接调用 run() 函数,而不是调用 start() ...
本示例提供了一个简单的多线程应用,旨在帮助理解如何创建、启动和停止线程。以下将详细讲解相关知识点。 首先,我们讨论如何**创建多线程**。在Java中,有两种主要的方法来创建线程:通过继承Thread类或实现...
线程编程实验 本实验的主要目的是了解多...本实验为我们提供了一个了解多线程的概念和应用的机会,我们可以通过实验来掌握线程的创建方法和任务类,理解事件分发线程机制和线程池的概念及应用,以及线程的同步和异步。
这也是为什么 start() 方法可以创建一个新的线程,而 run() 方法不能的原因。 start() 方法和 run() 方法都是启动线程的方法,但是它们的作用和实现方式不同。start() 方法可以创建一个新的线程,而 run() 方法只是...
- **实现Runnable接口**:这是最常见的创建线程的方式,只需创建一个类实现`Runnable`接口,然后在`run()`方法中编写线程执行的代码。接着,通过`Thread`类的构造函数创建一个新的线程对象,将Runnable实例作为参数...
`QThread`是一个跨平台的线程类,它提供了事件驱动的线程模型。这意味着在线程中可以使用Qt的信号和槽机制,使得线程间的通信变得更加便捷。与直接使用系统API创建线程相比,`QThread`更容易与Qt的其他部件集成。 ...
当你调用`Thread`对象的`start()`方法时,Java虚拟机(JVM)会为该线程分配系统资源,创建一个新的线程,并将`run()`方法的代码放入这个新线程的执行队列。此时,`run()`方法的内容将在新线程中异步执行,与主线程或...
由于QObject只能在其创建的线程中进行事件处理,所以在不同的线程中直接操作同一个QObject可能会导致错误。为了解决这个问题,可以使用moveToThread()方法将QObject移动到指定的线程: ```cpp QObject *myObject = ...
在实际编程中,如果你想启动一个新线程,应该使用start方法,而不是直接调用run方法。例如: public class Test1 extends Thread { @Override public void run() { while (true) { System.out.println(Thread....
这意味着当一个线程阻塞(如等待I/O操作)时,程序需要决定哪个线程应该获得CPU资源。在单个CPU上,这通常意味着在可运行的线程之间切换。在多核系统中,每个核心可以并发地运行不同线程,进一步提高了并行性。 在...
在本实验中,我们使用了 Thread 类中的 start() 方法来启动线程,并使用了 run() 方法来实现线程的执行过程。run() 方法中,我们使用了 for 循环来模拟线程的执行过程,并使用了 sleep() 方法来模拟线程的等待过程。...
`wait()`使当前线程等待,`notify()`唤醒一个等待的线程,`notifyAll()`唤醒所有等待的线程。 ### 5. 线程池与`ExecutorService` Java从1.5版本开始引入`ExecutorService`,它是一个线程池接口,可以管理和控制...
当一个线程被创建后,调用其`start()`方法将启动该线程,线程的执行体即`run()`方法内的代码将在新的线程中运行。 #### 示例代码解析 ```java class Hello extends Thread { public Hello(String name) { this....
当你创建一个新的`Thread`对象并启动它时,Java虚拟机(JVM)会为这个线程分配CPU时间片,从而使得代码可以在不同的线程间交替执行。 要实现自定义线程,你需要创建一个新的类并继承`Thread`。在这个例子中,我们...
我们需要 run() 和 start() 两个方法是因为 JVM 创建一个单独的线程不同于普通方法的调用。start() 方法由本地方法实现,需要显示地被调用。使用这两个方法的另外一个好处是任何一个对象都可以作为线程运行,只要...
创建一个新的类,继承自`Thread`,然后重写`run()`方法。当调用`start()`方法时,系统会自动调用`run()`方法,在新的线程中执行。例如: ```java public class MyThread extends Thread { @Override public ...
调用Thread对象的start()方法会启动一个新的线程,run()方法的代码将在新线程中执行。线程的生命周期包括新建(New)、可运行(Runnable)、运行(Running)、等待(Blocked)、结束(Terminated)等状态。 线程...
start()方法是启动线程的入口,run()方法是线程的主体。只有调用了start()方法,才会表现出多线程的特性。 4. Runnable接口和Callable接口的区别是什么? Runnable接口中的run()方法的返回值是void,Callable接口中...