由浅入深研究Android3--浅谈线程的一些东西(帮助理解)

线程究竟是什么?前面说过:进程是应用程序的执行实例,线程是进程内的执行路径。那么执行路径指的是什么呢?

1.线程路径

an application is executed as a series of instructions. The execution path of these instructions is a thread.

一个程序是以一系列指令运行的。执行这些代码的路径就是一个线程。

而每一个计算机程序至少有一个线程:被应用程序主体执行的线程。java程序中,这个线程被称为主线程,并且起始于你所定义类中的main()方法的第一条语句处。

我们试着来看下面一个求阶乘的程序:

public class Factorial

{

public static void main(String[] args)

{

int n = Integer.parseInt(args[0]);

System.out.println(n + " !is");

int fact = 1;

while(n > 1)

{

fact *= n--;

}

System.out.println(fact);

}

}

我们来看看这个程序的执行路径:

1. 将从命令行获得的参数转换为一个intn

2. 输出一些字符串。

3. 1存储在本地变量中fact

4. 如果n大于1,将n中存储的变量和fact中存储的变量相乘,并且n减去1

5. 如果不是,打印存储在fact变量中的值

以上就是程序的执行路径(path)。

2.深入线程路径

下面我们通过调用一个方法来看看线程内部的执行路径。在以下的示例中,我们可以看到,在主线程中执行一个循环,然后转而执行for01中的循环,最后再执行下一个主函数中的循环。代码如下:

// 一个for循环

public void for01()

{

for(int i = 0; i < 1000; i ++)

{

System.out.println("for01 :" + i);

};

}

// 主函数

public static void main(String[] args)

{

// 运行主函数的第一个for循环

for(int i = 0; i < 1000; i ++)

{

System.out.println("main :" + i);

};

// 运行for01方法

new ThreadMe().for01();

// 运行主函数的第二个for循环

for(int i = 0; i < 1000; i ++)

{

System.out.println("main :" + i);

};

}

其实对于计算机来说,其本身就是流水线工作。语句得一条一条的执行,所以线程的路径是:

main中的第一个for循环-->方法for01()中的循环-->main中的第二个for循环-->结束

总结:

·线程:执行代码的路径就是线程。

·其实无论是多线程还是单线程,相对于单个线程来说,其内部都是按照一条条的指令路径执行的。

3.启动两个主函数就是启动两个进程

我们知道,一个类中的static变量是保存在堆中的,我们下面看的是一个小例子说明的是两个主线程不会共享堆,因为每个进程都只有一个主线程,这两个线程都属于不同的进程,而进程之间是不能共享数据的,所以两个主线程之间是不共享数据的。但是由主线程启动的子线程会和主线程共享static变量数据。这个有兴趣的可以研究下,以后可能会用上。

//两个主线程中不会共享一个类中的static数据

public class UseStatic

{

// 关于类中的static变量

public static void main(String[] args)

{

HaveStatic.m_int = 10;

new Thread(new ThreadM()).start();

System.out.println("main_thread:" + HaveStatic.m_int);

for(int i = 0; i < 1000000000; i ++)

{

System.out.print("");

}

}

}

class UseStatic2

{

// 关于类中的static变量

public static void main(String[] args)

{

new Thread(new ThreadM()).start();

System.out.println("main_thread2:" + HaveStatic.m_int);

}

}

class HaveStatic

{

public static int m_int = 0;

}

class ThreadM implements Runnable

{

public void run()

{

System.out.println("sub_thread:" + HaveStatic.m_int);

}

}

运行UseStatic后直接运行UseStatic2,会发现UseStatic主线程和子线程的输出是都是10,而UseStatic2的子线程和主线程输出都为0,说明两个主线程之间不会共享数据。

总结:

·不严格的情况下,子线程会共享主线程的数据。

有关于多线程、线程池、以及锁机制等的一些东西会在以后需要的时候穿插进来,从下一节我们开始一步一步深入Android的系统内部。

本系列专题属于繁星皓月个人所有,欢迎转载,但需注明原文地址

http://www.cnblogs.com/lovewf/

更多相关文章

  1. 第一行代码读书笔记 Kotlin Android
  2. Android中的AsyncTask
  3. Android的视频播放之VideoView与SurfaceView
  4. Android(安卓)最火快速开发框架androidannotation简介
  5. Android(安卓)按键消息path
  6. Android线程管理之ThreadLocal理解及应用场景
  7. android中分页加载的实现:)
  8. 流水笔记--2015-9-13
  9. 如何在Android中利用AIDL添加service

随机推荐

  1. 漫谈Android安全框架
  2. 使用adb工具访问sqlite数据库
  3. android 应用程序数据共享shareuserid篇+
  4. android 打开/关闭 移动网络
  5. android studio 在xp/win8上安装,亲测
  6. TextView的XML属性说明全析 ---Android基
  7. Android(安卓)Environment.getExternalSt
  8. Android(安卓)ui utils-简单实用的Androi
  9. Android的Activity跳转动画集合
  10. 人人网官方Android客户端源码分析(1)