Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1071301
  • 博文数量: 403
  • 博客积分: 10272
  • 博客等级: 上将
  • 技术积分: 4407
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:22
文章分类

全部博文(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.    将从命令行获得的参数转换为一个intn

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的系统内部。

 

 

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

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

阅读(1019) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~