java中Thread类中的start()方法与run()方法

本文详细解释了Java中多线程的概念、作用以及如何通过Thread类和Runnable接口来实现多线程,包括启动线程的方法、线程体的概念、线程间的执行流程等关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程。
    而如果直接用Run方法,这只是调用一个方法而已,程序中依然只有主线程--这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。
    记住:线程就是为了更好地利用CPU,提高程序运行速率的!
   
public class TestThread1{
       
public static void main(String[] args){
           
Runner1 r=new Runner1();
            //r.run();//这是方法调用,而不是开启一个线程

            Thread t=new Thread(r);//调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。
           
t.start();
           
for(int i=0;i<100;i++){
                System.out.println("进入Main Thread运行状态
");
               
System.out.println(i);
           
}
       
}
   
}
    class Runner1 implements Runnable{ //实现了这个接口,jdk就知道这个类是一个线程

       
public void run(){
           
for(int i=0;i<100;i++){
                System.out.println("进入Runner1运行状态
");
               
System.out.println(i);
           
}
       
}
    }

注意:

Runnable接口分析

Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口.
Runnable接口非常简单,就定义了一个方法run(),继承Runnable并实现这个
方法就可以实现多线程了,但是这个run()方法不能自己调用,必须由系统来调用,否则就和别的方法没有什么区别了.
先给一个简单的例子:
public class MultiThread implements Runnable{
public static void main(String[] args){
     for(int i=0;i<10;i++){
        new Thread(new MultiThread()).start();//correct
                 //new Thread(new MultiThread()).run 1
   //new MultiThread().run()       2
     }
}
public void run(){    
     System.out.println(Thread.currentThread().getName());
}
}
运行后应该启动了10个新的线程,加上主线程一共11个线程,应该输出是Thread-1知道10.
这里要注意启动线程的方式是调用了Thread的start()方法,而不是run方法,如果
用注释里的1或者2输入都是10个main,因为这个时候run()方法还原了,和普通方法一样了.
我们也可以得出一个结论:所有的线程在运行时都是一个Thread实例,虽然可以不用继承Thread
实现多线程,但是最终还是Thread的一个实例.

为了您的安全,请只打开来源可靠的网址

打开网站    取消

来自: http://hi.baidu.com/xwang0923/blog/item/e4aab7ed1450803cacafd50a.html
### Java 中 `Thread` 的 `run()` 方法 `start()` 方法的区别及使用场景 #### 1. 基本概念 在 Java多线程编程中,`Thread` 提供了两个核心方法:`run()` 和 `start()`。这两个方法的功能和用途有显著差异。 - **`start()` 方法** 当调用 `start()` 方法时,它会触发 JVM 创建一个新的线程并执行该线程的任务[^1]。新线程一旦被创建,JVM 就会在后台自动调用 `run()` 方法来运行线程的具体逻辑。因此,`start()` 是真正用于启动线程的方法。 - **`run()` 方法** 这是一个普通的实例方法,通常由开发者重写以定义线程要执行的具体任务。如果直接调用 `run()` 方法而不是通过 `start()` 启动线程,则其行为似于普通方法调用,在当前线程上下文中执行,而不会开启新的线程[^3]。 #### 2. 工作机制对比 当调用 `start()` 方法时,JVM 执行以下操作: - 初始化新线程的相关资源。 - 切换到就绪状态等待 CPU 调度。 - 在获得调度权后,进入运行状态并通过内部机制调用 `run()` 方法完成实际工作[^4]。 然而,直接调用 `run()` 不涉及上述过程;它只是简单地作为常规函数被执行,无法实现真正的并发处理[^2]。 #### 3. 使用场景分析 以下是两种方法适用的不同情况: - **使用 `start()`** - 需要在独立的新线程里执行某些耗时或阻塞的操作。 - 实现程序内的并发控制,提高效率或者分离业务逻辑。 - **直接调用 `run()`** - 测试阶段快速验证 `run()` 内部代码逻辑是否正常运作而不必考虑多线程环境的影响。 - 特定情况下不需要利用额外线程仅需顺序执行某段流程时可采用这种方式简化开发复杂度。 #### 示例代码展示 下面给出一段基于前述理论的实际应用例子说明如何正确运用这两种方式: ```java public class MyTask extends Thread { @Override public void run() { System.out.println(Thread.currentThread().getName()+" says Hello!"); } public static void main(String[] args) throws InterruptedException{ MyTask task=new MyTask(); // 正确做法: 开启子线程 task.start(); /* 输出可能是(取决于CPU调度): Thread-0 says Hello! main continues... */ // 错误示范: 只是在主线程内模拟了单一线程的行为 task.run(); /* 输出总是: main says Hello! */ System.out.println("main continues..."); } } ``` #### 总结 综上所述,理解并区分 `start()` 和 `run()` 对于掌握 Java 多线程至关重要。只有合理选用它们才能充分发挥多核处理器的优势从而构建高效稳定的软件系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值