线程start() 和run()的区别

一个面试题引发的思考:

一个线程上直接调用了run()方法结果如何?我当时想的是抱方法找不到错误,今天测试了一下我错了!找了点资料学习了下,加上自己的理解整理如下(望指点)。

(1)调用start:

调用start()启动一个线程,该线程进入就绪状态,等待cpu分配执行时间,一旦得到执行时间就执行

run()线程体。无需等待该线程执行完毕再执行其他线程,真正实现多线程,cpu不会因为某个线程需要等待资源而进入空闲状态,cpu会被分配给其他线程执行。

测试代码:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class Test extends
Thread{

    

    public
static void main(String[] args) {   

        new
Test(){

            @Override

            public
void run() {

                for(int
i=0;i<1000;i++){

                    System.out.println(i);

                }

            }

        }.start();

        System.out.println("多线程");

    }

    

}

  执行结果:

0
1
2
3
4
5
6
7
8
9
10
11
多线程
12
13
14
15
16

...

多线程的位置不固定:有可能出现在打印数字之前,也有可能出现在数字中间。我想这是因为要看main线程和Test()线程谁先分配到cpu资源吧。

(2)调用run():

run()
就是一个普通的方法,完全可以直接调用,如果直接调用的话,程序只有main线程,程序执行路径也只有一条,还是顺序执行,run()执行完了才能执行其他的,这样就失去了线程的意义。

测试代码:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class Test extends
Thread{

    

    public
static void main(String[] args) {   

        new
Test(){

            @Override

            public
void run() {

                for(int
i=0;i<1000;i++){

                    System.out.println(i);

                }

            }

        }.run();

        System.out.println("多线程");

    }

    

}

  执行结果:

...

993
994
995
996
997
998
999
多线程

执行结果永远都是这样。

时间: 2024-11-08 05:00:54

线程start() 和run()的区别的相关文章

java线程中start和run的区别

public class Test1 extends Thread { @Override public void run() { while (true) { System.out.println(Thread.currentThread().getName()); } } public static void main(String[] args) { Test1 test1=new Test1(); test1.run(); //输出结果main test1.start(); //输出结果

线程同步、线程同步跟Runnable的区别

线程同步:创建多条线程,要一条线程执行完run()方法,下一个线程才能进入run()方法,线程同步就是为了避免同一条件下不允许多条线程同时进入而制造出来的方法. runnable跟同步的区别:runnable在同一条件下可以同时进入多条线程,而同步不行. 例子,售票台有ticket=100张票,每卖一张run(){ticket--;},当买到只剩一张时,这时线程在未执行ticket--:之前延迟,如果用runnable,就有可能其他线程也进入run(),造成卖出负数张票,而用同步一条线程执行完r

Java多线程3:Thread中start()和run()的区别

原文:http://www.cnblogs.com/skywang12345/p/3479083.html start() 和 run()的区别说明start():它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用.run():run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 下面以代码来进行说明. class MyThread extends Thread{ public void

java 多线程系列基础篇(三)之start()和run()的区别

概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答. start() 和 run()的区别说明 start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用.run()   : run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 下面以代码来进行说明. class MyThread extends Thread{ public voi

Java基础加强之并发(三)Thread中start()和run()的区别

Thread中start()和run()的区别 start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用.run()   : run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! MyThreadTest.java代码 class MyThread extends Thread{ public void run() { System.out.println("线程名:&qu

Java多线程系列 基础篇03 Thread中start()和run()的区别

1. start() 和 run()的区别 start():启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用(会抛出异常). run() :run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 2. start() 源码(by jdk1.8) public synchronized void start() { //判断状态是否为 New : if (threadStatus != 0) thr

Java多线程和并发(二),Thread中的start和run的区别

目录 1.调用run方法 2.调用start方法 3.start和run的区别 二.Thread中的start和run的区别 1.调用run方法 public class ThreadTest { private static void attack() { System.out.println("Current Thread is : " + Thread.currentThread().getName()); } public static void main(String[] a

多线程start()与run()的区别

概要 1.start()与run()介绍 2.start()与run()源码查看 3.start()与run()测试 start()与run()介绍 1.通过我们在启动线程的时候使用的start,为什么不用run呢? 因为start()会新开一个线程来执行:而run只是一个普通想法,相当于当前线程来调用,不会启动新线程: 2.start()只能调用一次,run()可以调用多次 start()与run()源码查看 1.先来看下start()的源码,start()启动线程其实是通过start0()启

(转) Java多线程中start()和run()的区别

Java的线程是通过java.lang.Thread类来实现的.VM启动时会有一个由主方法所定义的线程.可以通过创建Thread的实例来创建新的线程.每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体.通过调用Thread类的start()方法来启动一个线程. 在Java当中,线程通常都有五种状态,创建.就绪.运行.阻塞和死亡: 第一是创建状态.在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态. 第二是就绪状态.当调用了线