多线程:创建Thread为什么要调用start启动,而不能直接调用run方法
2017-10-05 11:47
741 查看
最近在学习Android Service时遇到这样多线程问题。
start()方法启动线程后,整个线程处于就绪状态,等待虚拟机调度, 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。期间虚拟机是分时间片轮番调用各个线程体的。
run()方法启动是当作普通方法的方式调用,这里虚拟机不会线程调度,虚拟机会执行这个方法直到结束后自动退出。
参考进程、线程调度,javaThread生命周期。
start()方法启动线程后,整个线程处于就绪状态,等待虚拟机调度, 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。期间虚拟机是分时间片轮番调用各个线程体的。
run()方法启动是当作普通方法的方式调用,这里虚拟机不会线程调度,虚拟机会执行这个方法直到结束后自动退出。
参考进程、线程调度,javaThread生命周期。
package com.example.wangchuncheng.myservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MyService extends Service { private boolean running = false; private String data = "这是默认信息"; public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { data = intent.getStringExtra("data"); return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { super.onCreate(); running = true; new Thread(){ @Override public void run() { super.run(); while(running){ System.out.println(data); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); //这里使用run的话,开始服务后会卡死,导致程序无响应 } @Override public void onDestroy() { super.onDestroy(); running = false; } }
相关文章推荐
- 调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
- 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
- 为什么我们调用start()方法时会执行run()方法?为什么我们不能直接调用run()方法?他们之间有什么区别?
- Java传统多线程的实现有两种方法,继承Thread类或者实现Runnable即可.线程启动时调用start()方法.
- 创建线程的几种方式,以及为什么启动线程不用run,而用start方法!!!
- Thread直接调用run()和start()方法的区别
- 多线程执行时为什么调用的是start()方法而不是run()方法
- 多线程为什么调用start而不是调用run方法
- 创建线程的几种方式,以及为什么启动线程不用run,而用start方法。
- 为什么java中在Thread的run方法中不能throws
- java多线程-概述-创建线程_继承Thread类-run和start特点
- java 中两种多线程的区别,start方法和run方法的启动区别
- Thread中调用start()和run()方法的区别
- Java - 启动一个线程是调用run()方法还是start()方法?
- 在启动线程时是应该调用线程的run()方法还是start()方法?
- java.lang.IllegalThreadStateException异常原因解析——同一个线程不能重复调用start方法
- 线程 创建和启动线程的两种方式 实现Runnable接口 继承Thread类 重写唯一方法run()
- python 8-1 如何使用多线程,Thread创建线程,执行函数赋值给target//类+函数放在run方法中执行
- 线程为什么调用start()而不是直接调用run()
- java再复习——多线程之初识线程,并从源码角度分析start与run方法,Thread类与Runnable接口