全部博文(403)
2012年(403)
分类: 嵌入式
2012-04-02 21:59:52
线程究竟是什么?前面说过:进程是应用程序的执行实例,线程是进程内的执行路径。那么执行路径指的是什么呢?
.线程路径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)。
深入线程路径下面我们通过调用一个方法来看看线程内部的执行路径。在以下的示例中,我们可以看到,在主线程中执行一个循环,然后转而执行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的系统内部。
本系列专题属于繁星皓月个人所有,欢迎转载,但需注明原文地址