Java多线程-run方法与start方法的区别
- 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();
- }
- }
- }
- }
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方法的区别的更多相关文章
- Java 多线程实现接口Runnable和继承Thread区别(转)
Java 多线程实现接口Runnable和继承Thread区别 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别 ...
- Java 多线程启动为什么调用 start() 方法而不是 run() 方法?
多线程在工作中多多少少会用到,我们知道启动多线程调用的是 start() 方法,而不是 run() 方法,你知道原因吗? 在探讨这个问题之前,我们先来了解一些多线程的基础知识~ 线程的状态 Java ...
- java多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify 先看一下java线程运行时各个阶段的运行状态 j ...
- java多线程有几种实现方法,都是什么?
转自:http://www.cnblogs.com/liujichang/p/3150387.html 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方法有两种, ...
- JAVA多线程实现的三种方法
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- Java多线程【三种实现方法】
java多线程 并发与并行 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行 并行:一组程 ...
- java 多线程阻塞队列 与 阻塞方法与和非阻塞方法
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
- Java 多线程同步的五种方法
一.引言 闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常.举个例子 ...
- java多线程有几种实现方法?线程之间如何同步
java中多线程的实现方法有两种:1.直接继承thread类:2.实现runnable接口: 同步的实现方法有五种:1.同步方法:2.同步代码块:3.使用特殊域变量(volatile)实现线程同步:4 ...
随机推荐
- 转一篇sublime必备的一些插件
Package Control 功能:安装包管理 简介:sublime插件控制台,提供添加.删除.禁用.查找插件等功能 使用:https://sublime.wbond.net/installatio ...
- crontab 详解 -- (转)
cron 是一个可以用来根据时间.日期.月份.星期的组合来调度对重复任务的执行的守护进程. cron 假定系统持续运行.如果当某任务被调度时系统不在运行,该任务就不会被执行. 要使用 cron 服务, ...
- Java线程总结(二)
自定义线程的数据可以共享,也可以不共享,这要看具体的实现方式. 1.不共享数据多线程实现方式: public class MyThread extends Thread{ private int co ...
- tornado简单使用
这篇适用于快速上手想了解更深:http://www.tornadoweb.cn/ https://tornado-zh.readthedocs.io/zh/latest/ Tornado 是 Fr ...
- 网络知识===关于MAC地址和IP不能互相替代,缺一不可的原因
最近在看书<图解TCP/IP>书中分别谈到了IP和MAC地址.于是我就有两个疑惑, 为什么有了IP地址,我们还要获取MAC地址? 为什么我们初始不直接使用MAC地址作为终点地址?还要那么复 ...
- 利用keepalive+mysql replication 实现数据库的高可用
利用keepalive+mysql replication 实现数据库的高可用 http://www.xuchanggang.cn/archives/866.html
- 微信小程序实现图片上传,预览,删除
wxml: <view class='imgBox'> <image class='imgList' wx:for="{{imgs}}" wx:for-item= ...
- Linux下通过jstat命令查看jvm的GC情况
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 注意!!!:使用的jdk版本是jdk8. ...
- .net页面实时预览图片
<script type="text/javascript"> //获取上传图片的本地路径 function getPath(obj){ if(obj) { if(na ...
- cacti (不可以利用yum安装cacti的配置)
我们如果用yum不可以安装cacti,我们则可以利用tar包来安装!!! //cacti的配置准备 [root@localhost ~]# yum install -y epel-release [r ...