1. package com.interview;
  2. /**
  3. * java多线程的两种实现方式以及run、start方法的区别
  4. * @author MEI.LIU
  5. *
  6. */
  7. public class ThreadTest {
  8. public static void main(String[] args) throws InterruptedException {
  9. ThreadTest tt = new ThreadTest();
  10. Thread1 t1 = tt.new Thread1();
  11. Thread2 t2 = tt.new Thread2();
  12. Thread3 t3 = tt.new Thread3();
  13. Thread4 t4 = tt.new Thread4();
  14. //实现Runnable方法的方式必须要用new Thread(tt.new Thread5())来转换为Thread类型,才能调用Thread的start方法)
  15. Thread t5 = new Thread(tt.new Thread5());
  16. t1.start();
  17. Thread.sleep(1000);
  18. t2.start();
  19. Thread.sleep(1000);
  20. t3.start();
  21. Thread.sleep(1000);
  22. t4.start();
  23. Thread.sleep(10000);
  24. ((Thread) t5).start();
  25. }
  26. class Thread1 extends Thread {
  27. public void run() {
  28. try {
  29. while (true) {
  30. for (int i = 1000;; i--) {
  31. Thread.sleep(1000);
  32. System.out.println("现在i的值为:" + i);
  33. }
  34. }
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. class Thread2 extends Thread {
  41. public void run() {
  42. try {
  43. while (true) {
  44. System.out.println("哈哈哈哈哈哈哈哈哈");
  45. Thread.sleep(666);
  46. }
  47. } catch (InterruptedException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. class Thread3 extends Thread {
  53. public void run() {
  54. try {
  55. while (true) {
  56. for (int j = 1000;; j--) {
  57. System.out.println("目前,j的值是:" + j);
  58. Thread.sleep(2000);
  59. }
  60. }
  61. } catch (InterruptedException e) {
  62. e.printStackTrace();
  63. }
  64. }
  65. }
  66. class Thread4 extends Thread {
  67. public void run() {
  68. try {
  69. while (true) {
  70. System.out.println("TTTTTTTTTTTTTTTTTTT");
  71. Thread.sleep(5000);
  72. }
  73. } catch (InterruptedException e) {
  74. e.printStackTrace();
  75. }
  76. }
  77. }
  78. class Thread5 implements Runnable {
  79. public void run() {
  80. try {
  81. while (true) {
  82. System.out.println("咚咚咚咚咚咚咚咚咚咚咚咚咚");
  83. Thread.sleep(1400);
  84. }
  85. } catch (InterruptedException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. }
  90. }
package com.interview;
/**
* java多线程的两种实现方式以及run、start方法的区别
* @author MEI.LIU
*
*/
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
ThreadTest tt = new ThreadTest();
Thread1 t1 = tt.new Thread1();
Thread2 t2 = tt.new Thread2();
Thread3 t3 = tt.new Thread3();
Thread4 t4 = tt.new Thread4();
//实现Runnable方法的方式必须要用new Thread(tt.new Thread5())来转换为Thread类型,才能调用Thread的start方法)
Thread t5 = new Thread(tt.new Thread5());
t1.start();
Thread.sleep(1000);
t2.start();
Thread.sleep(1000);
t3.start();
Thread.sleep(1000);
t4.start();
Thread.sleep(10000);
((Thread) t5).start();
} class Thread1 extends Thread {
public void run() {
try {
while (true) {
for (int i = 1000;; i--) {
Thread.sleep(1000);
System.out.println("现在i的值为:" + i);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} class Thread2 extends Thread {
public void run() {
try {
while (true) {
System.out.println("哈哈哈哈哈哈哈哈哈");
Thread.sleep(666);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} class Thread3 extends Thread {
public void run() {
try {
while (true) {
for (int j = 1000;; j--) {
System.out.println("目前,j的值是:" + j);
Thread.sleep(2000);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} class Thread4 extends Thread {
public void run() {
try {
while (true) {
System.out.println("TTTTTTTTTTTTTTTTTTT");
Thread.sleep(5000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} class Thread5 implements Runnable {
public void run() {
try {
while (true) {
System.out.println("咚咚咚咚咚咚咚咚咚咚咚咚咚");
Thread.sleep(1400);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

区别:调用start方法实现多线程,而调用run方法没有实现多线程

Start:

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

Run:

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

 控制台输出结果:

 

Java多线程-run方法与start方法的区别的更多相关文章

  1. Java 多线程实现接口Runnable和继承Thread区别(转)

    Java 多线程实现接口Runnable和继承Thread区别 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别 ...

  2. Java 多线程启动为什么调用 start() 方法而不是 run() 方法?

    多线程在工作中多多少少会用到,我们知道启动多线程调用的是 start() 方法,而不是 run() 方法,你知道原因吗? 在探讨这个问题之前,我们先来了解一些多线程的基础知识~ 线程的状态 Java ...

  3. java多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

    多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify 先看一下java线程运行时各个阶段的运行状态 j ...

  4. java多线程有几种实现方法,都是什么?

    转自:http://www.cnblogs.com/liujichang/p/3150387.html 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方法有两种, ...

  5. JAVA多线程实现的三种方法

    JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  6. Java多线程【三种实现方法】

    java多线程 并发与并行 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行 并行:一组程 ...

  7. java 多线程阻塞队列 与 阻塞方法与和非阻塞方法

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

  8. Java 多线程同步的五种方法

    一.引言 闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常.举个例子 ...

  9. java多线程有几种实现方法?线程之间如何同步

    java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口: 同步的实现方法有五种:1.同步方法:2.同步代码块:3.使用特殊域变量(volatile)实现线程同步:4 ...

随机推荐

  1. JDK工具学习

    javap: 可以对照源代码和字节码,从而了解很多编译器内部的工作. 查看class字节码:JDK有自带的工具包,使用javap命令打开.class文件就行 javap -c JAVAPTest

  2. 【bzoj3476-懒惰的奶牛】线段树

    题解: 感觉这题和别人的做法不一样...呵呵呵...调了一百年.. 设家坐标为(a,b),对于每个点(x,y),可以转化为|a-x|+|b-y|<=k 对于每个点,它的影响范围是一个菱形(也就是 ...

  3. python初步学习-python运算符

    算数运算符 操作 描述 例子 + 加法-对操作符的两侧增加值 a+b=30 - 减法 a-b=30 * 乘法 a * b = 30 / 除法 a/b=30 % 模(取余) a%b=30 ** 指数(幂 ...

  4. 一些达成共识的JavaScript编码风格约定【转】

    如果你的代码易于阅读,那么代码中bug也将会很少,因为一些bug可以很容被调试,并且,其他开发者参与你项目时的门槛也会比较低.因此,如果项目中有多人参与,采取一个有共识的编码风格约定非常有必要.与其他 ...

  5. jq_常用开发模块

    1.循环模块 var html = ""; $.each(data, function(k, v) { html += '<li>' + '<div>' + ...

  6. deepin 快捷键

    从此脱离鼠标

  7. ShellCode的几种调用方法

    ShellCode是一种漏洞代码,中文名也叫填充数据,一般是用C语言或者汇编编写.在研究的过程中,自己也学到了一些东西,发现其中也有许多坑,所以贴出来,如果大家有碰到的,可以参考一下. 以启动电脑上的 ...

  8. 浅谈C语言中的强符号、弱符号、强引用和弱引用【转】

    转自:http://www.jb51.net/article/56924.htm 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引 ...

  9. Xmind 8 update5 破解

    Step 1. Download XMind Step 2. Run XMind at least once after installation, xmind will init the confi ...

  10. 数据库===轻量级mysql数据库管理工具

    已经上传至: https://download.csdn.net/download/bo_mask/10276952