Java start和run启动线程的区别
我们知道,我们通过调用线程的start方法启动一个线程,那么,我们可以直接调用run方法来启动一个线程吗?
先看下面一段代码:
- public class Test {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- TestThread tt = new TestThread();
- tt.run();
- }
- }
- class TestThread extends Thread {
- static int i = 0;
- final static int MAX_I = 10;
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while (i < MAX_I) {
- System.out.println(i++);
- }
- }
- }
运行结果如下:
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
或许有人会得出结论,这样启动一个线程是可以的,我们再对程式稍做修改,大家就会发现一个问题:
- public class Test {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- TestThread tt = new TestThread();
- tt.run();
- System.out.println("Printed by main thread");
- }
- }
- class TestThread extends Thread {
- static int i = 0;
- final static int MAX_I = 10;
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while (i < MAX_I) {
- System.out.println(i++);
- }
- }
- }
这里只在主线程中加入了一行代码,打印一行"Printed by main thread",运行代码,结果如下:
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- Printed by main thread
熟练多线程开发的要发现问题了,为什么"Printed by main thread"会打印在最后一行呢?TestThread类中一直持有时间段吗?
我们对上面的代码进行分析,其实非常简单,这只是一个普通的类中方法的调用,其实是一个单线程的执行,我们来修改代码进一步验证这一点:
- public class Test {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- TestThread tt = new TestThread();
- tt.run();
- System.out.println(Thread.currentThread().getName());
- System.out.println("Printed by main thread");
- }
- }
- class TestThread extends Thread {
- static int i = 0;
- final static int MAX_I = 10;
- @Override
- public void run() {
- // TODO Auto-generated method stub
- System.out.println(Thread.currentThread().getName());
- while (i < MAX_I) {
- System.out.println(i++);
- }
- }
- }
这段代码分别在主线程和我们的TestThread的方法中打印当前线程名字,运行结果如下:
- main
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- main
- Printed by main thread
在TestThread类和主线程中运行的是同一个线程,说明在直接调用run时是不能使用多线程的,那么把上面的run方法调用改为start方法的调动再看一下:
- public class Test {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- TestThread tt = new TestThread();
- tt.start();
- System.out.println(Thread.currentThread().getName());
- System.out.println("Printed by main thread");
- }
- }
- class TestThread extends Thread {
- static int i = 0;
- final static int MAX_I = 10;
- @Override
- public void run() {
- // TODO Auto-generated method stub
- System.out.println(Thread.currentThread().getName());
- while (i < MAX_I) {
- System.out.println(i++);
- }
- }
- }
运行结果如下:
- main
- Thread-0
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- Printed by main thread
- 9
很明显,这才是我们想看到的结果,所以结论是只有调用Thread的start方法,将线程交由JVM控制,才能产生多线程,而直接调用run方法只是一个普通的单线程程式。
Java start和run启动线程的区别的更多相关文章
- Java Thread 的 run() 与 start() 的区别
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 1. ...
- Java并发编程:Java Thread 的 run() 与 start() 的区别
1. sleep 和 wait 方法解释 sleep()方法是Thread类里面的,主要的意义就是让当前线程停止执行,让出cpu给其他的线程,但是不会释放对象锁资源以及监控的状态,当指定的时间到了之后 ...
- java Thread 类 run 和 start 方法区别
public class ThreadModle { public static void main(String[] args) throws InterruptedException { Thre ...
- Java中Thread方法启动线程
public class ThreadTest extends Thread { private int count = 10; @Override public void run() { //重写 ...
- Java Thread 的 sleep() 和 wait() 的区别
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 1. sleep ...
- Java线程Run和Start的区别
先上结论:run只是Thread里面的一个普通方法,start是启动线程的方法.何以见得呢?可以执行下面的代码看看run和start的区别: package com.basic.thread; /** ...
- 启动线程,start和run的区别
每个线程都有要执行的任务.线程的任务处理逻辑可以在Tread类的run实例方法中直接实现或通过该方法进行调用,因此 run()相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相应线程时直接 ...
- JAVA面试题 启动线程是start()还是run()?为什么?
面试官:请问启动线程是start()还是run()方法,能谈谈吗? 应聘者:start()方法 当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它 ...
- java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器
多线程并发就像是内功,框架都像是外功,内功不足,外功也难得精要. 1.进程和线程的区别 一个程序至少有一个进程,一个进程至少有一个线程. 用工厂来比喻就是,一个工厂可以生产不同种类的产品,操作系统就是 ...
随机推荐
- 【leetcode刷题笔记】Sqrt(x)
Implement int sqrt(int x). Compute and return the square root of x. 题解:二分的方法,从0,1,2.....x搜索sqrt(x)的值 ...
- 每天一个linux命令(10):touch命令
版权声明更新:2017-05-14博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...
- ACM学习历程—HDU1041 Computer Transformation(递推 && 大数)
Description A sequence consisting of one digit, the number 1 is initially written into a computer. A ...
- 排成一行的li之间的间隙问题
现象 对于ul下li排成一行的布局(即li的display由list-item设为inline-block): 情况1 如果这些li在书写的时候有换行或者有空格,且ul本身的font-size不为0, ...
- 编写dockerfile
参考:http://www.cnblogs.com/liuyansheng/p/6098470.html 一.dockerfile介绍: 是一种被Docker程序解释的脚本,Dockerfile由一条 ...
- UILabel UiButton 文字下面加下划线
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"直接进入" ...
- 优化Java堆大小的5个技巧
本文作者Pierre是一名有10多年经验的高级系统架构师,他的主要专业领域是Java EE.中间件和JVM技术.根据他多年的工作实践经验,他发现许多性能问题都是由Java堆容量不足和调优引起的.下面他 ...
- JSP标签和EL表达式
1.jsp标签: sun原生的,直接jsp使用 <jsp:include> -- 实现页面包含,动态包含 <jsp:include page="/index.jsp&quo ...
- Android Studio的Android Monitor窗口中把标签拉出来之后放不回去的解决方法
不小心把下图方框中的logcat标签拖出来之后, 就变成了图2的浮动窗口,发现logcat标签怎么也弄不回原来窗口中的位置中. 其实解决方法很简单,只要拖住下图浮动窗口中红框位置的logcat标签,然 ...
- [原创] 新人分享--ORA-01012:not logged on的解决办法 [复制链接]
转自:http://f.dataguru.cn/thread-82530-1-1.html