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 ...
随机推荐
- Item 1----------考虑用静态工厂方法代替构造器
读书,有时候,我感觉总是有点绕和不具体.我阅读了代码,理解代码后,才有一种理解和把握的感觉. 优点三. 把某个对象的构建放给客户端来实现. 比如下面的实现,客户端Test,获取Service的实例 ...
- noip2012~2015刷题小记录
2012d1t1 密码 模拟题 #include<cstdio> #include<cstdlib> #include<cstring> #include<c ...
- 【HNOI】d 最小割
[题目大意]给定一个n*m的土地,每块可以种a或b作物,每种作物在不同的位置有不同的收成,同时,有q个子矩阵中,全部种指定的作物(a或b)会有一定的加成收成,求最大收成. [数据范围] 50% n,m ...
- Java回收方法区中回收的类
回收的类必须满足下面三个条件才能算是“无用的类” 1.该类所有的实例都已经被回收,也就是说Java堆中不存在该类的任何实例: 2.加载该类的ClassLoader已经被回收: 3.该类对应的java. ...
- python爬虫模块之HTML下载模块
HTML下载模块 该模块主要是根据提供的url进行下载对应url的网页内容.使用模块requets-HTML,加入重试逻辑以及设定最大重试次数,同时限制访问时间,防止长时间未响应造成程序假死现象. 根 ...
- 105.Construct Binary Tree from Preorder and Inorder Traversal---《剑指offer》面试6
题目链接 题目大意:根据先序遍历和中序遍历构造二叉树. 法一:DFS.根据模拟步骤,直接从先序和中序数组中找值然后加入二叉树中,即先从先序数组中确定根结点,然后再去中序数组中确定左子树和右子树的长度, ...
- Oracle sql中的正则表达式
SELECT first_name, last_nameFROM employeesWHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$'); FIRST_NAM ...
- [How to] 动态布局可变高度的cell的应用
1.简介 代码:https://github.com/xufeng79x/DynamicChangeableCell 微博界面,微信和QQ聊天界面,这些界面的布局大都不确定,且每一条消息的高度也不一样 ...
- python 基础习题
1.8<<2等于? 8 ---> 1000 32 ---> 100000 -----------结果--- 32 2.通过内置函数计算5除以2的余数 print(dir()) ...
- 【C++】C++11的auto和decltype关键字
转自: http://www.linuxidc.com/Linux/2015-02/113568.htm 今天要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已 ...