Skip to content

thread #2

@phxnirvana

Description

@phxnirvana

说到线程,就不得不从它的历史讲起,在那个cpu只有一个核心的年代,系统中只有进程的概念。什么是进程呢,进程是一个能够拥有资源和独立调度的基本单位。不同进程之间的数据是相互隔离无法访问的。这时候如果要读文件该怎么办呢,再开一个读文件进程,读完之后通过跨进程通信的方式将这片内存拷贝给需要的进程。可以看出来这之间资源调度的开销很大。

为了解决进程粒度太粗的问题,引入了线程的概念,一个进程中可以有多个线程,不同线程可以独立执行任务,同时共享相同内存数据。数据同步问题也就随之而来了。

老规矩,先从构造方法入手,构造方法中调用了init()方法,其中需要传入的参数有:

  • @param g the Thread group
    如果参数为null,则传入当前线程的threadgroup
  • @param target the object whose run() method gets called
    线程里要跑的内容
  • @param name the name of the new Thread
    名字,不能为空,否则会抛出异常
  • @param stackSize the desired stack size for the new thread, or zero to indicate that this parameter is to be ignored.
    栈大小

里面是一些赋初值的操作,然后又调用了init2()方法,继承了父线程的contextClassLoader,一个没用的inheritedAccessControlContext,还有父类中inheritableThreadLocals的内容。

Run, Gump, run! 直接调用run,然后就run了这个是错误的操作。结果是在当前线程执行run方法的内容,而不是在我们新建的线程执行。我们应该执行的是Thread.start()方法。其中调用了ThreadGroup.add()方法,我们可以看到这个add中有一个初始化线程数组的操作,目前不知道它的用处,暂且跳过。方法大致结果是将线程放到线程数组中,计数器++,同时未启动线程计数器--。然后返回到start继续往下看,可以发现在try方法块中才真正执行了thread的创建。
ref:理解Android线程创建流程

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions