您的位置:首页 > 移动开发 > Android开发

由浅入深研究Android(3)--浅谈线程的一些东西

2012-04-02 08:38 232 查看

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

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

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. 将从命令行获得的参数转换为一个int值n。

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: