线程究竟是什么?前面说过:进程是应用程序的执行实例,线程是进程内的执行路径。那么执行路径指的是什么呢?
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循环-->结束
总结:
·线程:执行代码的路径就是线程。
·其实无论是多线程还是单线程,相对于单个线程来说,其内部都是按照一条条的指令路径执行的。
我们知道,一个类中的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的系统内部。
本系列专题属于繁星皓月个人所有,欢迎转载,但需注明原文地址