惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

博客园 - frank.net

中国软件工业的冤枉路 随便写写 windows2000实现双机热备份(转) 规范软件开发过程-软件配置管理实践 多线程编程 高级主题(二)注:转 多线程编程 高级主题(一)注:转 多线程编程 秘籍篇(二)注:转 多线程编程 秘籍篇(一)注:转 多线程编程 实践篇(五)注:转 - frank.net - 博客园 多线程编程 实践篇(四)注:转 - frank.net - 博客园 多线程编程 实践篇(三)注:转 多线程编程 实践篇(二)注:转 多线程编程 实践篇(一)注:转 多线程编程 基础篇(四)注:转 多线程编程 基础篇(三)注:转 多线程编程 基础篇(二)注:转 多线程编程 关于创业方向和项目 Servlet Cookie操作总结
多线程编程 基础篇(一)注:转
frank.net · 2008-10-07 · via 博客园 - frank.net

多线程编程 基础篇(一)注:转

Posted on 2008-10-07 15:55  frank.net  阅读(205)  评论()    收藏  举报

如同程序和进程的区别,要掌握多线程编程,第一要弄清的问题是:线程对象和线程的区别.

    线程对象是可以产生线程的对象.比如在java平台中Thread对象,Runnable对象.
    线程,是指正在执行的一个指令序列.在java平台上是指从一个线程对象的start()开始.
运行run方法体中的那一段相对独立的过程.
    
    鉴于作者的水平,无法用更确切的词汇来描述它们的定义.但这两个有本质区别的概念请初
学者细细体会,随着介绍的深入和例程分析的增加,就会慢慢明白它们所代表的真实含义.

    天下难事必始于易,天下大事必始于细.

    让我们先从最简单的"单线程"来入手.(1)带引号说明只是相对而言的单线程.(2)基于java

    class BeginClass{
        public static void main(String[] args){
            for(int i=0;i<100;i++)
                System.out.println("Hello,World!");
        }
    }

    如果我们成功编译了该java文件,然后在命令行上敲入:

    java BeginClass
    现在发生了什么呢?每一个java程序员,从他开始学习java的第一分钟里都会接触到这个问
题,但是,你知道它到底发生发什么?

    JVM进程被启动,在同一个JVM进程中,有且只有一个进程,就是它自己.然后在这个JVM环境中,
所有程序的运行都是以线程来运行.JVM最先会产生一个主线程,由它来运行指定程序的入口点.在这个
程序中,就是主线程从main方法开始运行.当main方法结束后,主线程运行完成.JVM进程也随之退出.
    我们看到的是一个主线程在运行main方法,这样的只有一个线程执行程序逻辑的流程我们称
之为单线程.这是JVM提供给我们的单线程环境,事实上,JVM底层还至少有垃圾回收这样的后台线程以
及其它非java线程,但这些线程结我们而言不可访问,我们只认为它是单线程的.

主线程是JVM自己启动的,在这里它不是从线程对象产生的.在这个线程中,它运行了main方法
这个指令序列.理解它,但它没有更多可以研究的内容.

    [接触多线程]

    class MyThread extends Thread{
        public void run(){
            System.out.println("Thread say:Hello,World!");
        }
    }

    public class MoreThreads{
        public static void main(String[] args){
            new MyThread();
            new MyThread().start();
            System.out.println("Main say:Hello,World");
        }
    }
    
    执行这个程序,main方法第一行产生了一个线程对象,但并没有线程启动.
    main方法第二行产生了一个线程对象,并启动了一个线程.
    main方法第三行,产生并启动一个线程后,主线程自己也继续执行其它语句.

    我们先不研究Thread对象的具体内容,稍微来回想一下上面的两个概念,线程对象和线程.
    在JAVA中,线程对象是JVM产生的一个普通的Object子类.
    而线程是CPU分配给这个对象的一个运行过程.我们说的这个线程在干什么,不是说一个线
程对象在干什么,而是这个运行过程在干什么.如果一时想不明白,不要急,但你要记得它们不是一回
事就行了.