Java多线程系列-start()和run方法的区别

  • start()和run是Thread类里面的两个方法。

    学过的都知道,我们创建了一个线程类,通过调用start()方法来启动线程,并且该线程会执行内部的run()方法,那么我们可以直接调用run()方法吗。

    答案显而易见,当然是可以啊,可是前后两者还是有本质的区别的。



start()run()

  • 调用start()方法,会创建一个新的线程,而这个新的线程会执行Thread类中的run方法
  • 调用run()方法,不会创建新的线程,而是直接在当前的线程直接执行该方法。

以上就是这两个方法的本质区别,并且大多数情况下,直接调用run()的错误的。

public class StartAndRunTest {

    private static class MyThread extends Thread{

        private String name;

        public MyThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            System.out.println(name+" running in "+Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        MyThread m1=new MyThread("m1");
        MyThread m2=new MyThread("m2");

        m1.start();
        m2.run();
    }

}
/*
m2 running in main
m1 running in Thread-0
*/

上面的例子你可以看到,调用start的Thread类在新的线程上执行run方法,而直接调用run()方法的则是在当前main线程。(一个线程不能重复start(),具体可以看内部实现)

原文地址:https://www.cnblogs.com/viscu/p/9779297.html

时间: 2024-12-31 03:11:18

Java多线程系列-start()和run方法的区别的相关文章

Java -- Thread中start和run方法的区别

一.认识Thread的 start() 和 run() 1.start(): 我们先来看看API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并发地运行:当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法). 多次启动一个线程是非法的.特别是当线程已经结束执行后,不能再重新启动. 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类的

Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取.ReentrantLock分为"公平锁"和"非公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源,防止多个线程同时操作线程而出错,ReentrantLock在

java多线程系列8-线程的优先级

在java中设置线程优先级使用setPriority,在jdk中的源代码如下: public final void setPriority(int newPriority) { ThreadGroup g; checkAccess(); if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { throw new IllegalArgumentException(); } if((g = getThreadGroup())

Java多线程系列十——BlockingQueue类

参考资料:http://ifeve.com/java-synchronousqueue/http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.htmlhttp://ifeve.com/java-blocking-queue/ BlockingQueue的几个API认识 方法 说明 add(E e) 添加元素,超出队列size上限后抛异常 offer(E e) 添加元素,超出队列size上限后抛异常,相比add官方更建议使用offer方

java多线程系列(三)

等待通知机制 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 非等待通知 public void run() { try {

java多线程系列(一)

java多线程技能 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 并发历史 在没有操作系统的时候,一台计算机只执行一个程序,

java多线程系列(二)

对象变量的并发访问 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(四)之ReentrantLock的使用 线程安全 线程安全就是多线程访问时,采用了加锁机制,当一个

java多线程系列——(1)写在前面

写在前面 本系列博客主要针对java多线程的基础知识以及对基础的扩展,让大家更好的去理解和掌握java多线程方面的知识. 注:我将会用通俗易懂的语言去阐述java多线程的相关知识,必要的时候会结合图来说明,大家有不明白的地方欢迎留言给我,我会逐一回复的! 针对java多线程,以下知识点是十分重要的: 线程和进程的区别 java创建线程的两种方式 start方法和run方法的区别 线程的生命周期 synchronized块和synchronized关键字的使用技巧和适应场景 volitale关键字

Java多线程系列——计数器 CountDownLatch

简介: CountDownLatch 是一个非常实用的多线程控制工具类,通常用来控制线程的等待,它可以让某个线程等待直到倒计时结束 CountDownLatch 提供了两个主要的方法,await().countDown(). await:使当前线程阻塞,等待计数器为 0 countDown:计数器减一,计数为零时,释放所有在等待的线程 实例: public class CountDownLatchDemo implements Runnable { static final CountDownL