首先要知道什么是进程
进程:程序的一次动态执行叫做进程,一个进程可以有若干个线程组成。
线程与生俱来就用“任务性质”,task性。从计算机程序设计的角度来看,线程就是“任务”的化身。
thread在被构造后就会存在,但是在那个时间点还没有任何运行的程序代码。此时thread是在等待的阶段。
在这等待的阶段,其他thread可以与已经存在的thread对象交互。等待中的thread有数种属性可以设定:它的priority,名称,daemon状态等,但其实每个属性只是以调用等待中thread的method 来设定。因此,即使thread是在等待,它的状态还是可以被其他thread改变。
当你已经准备好要用 thread运行程序代码时,可以调用它的start()方法,这个method会执行一些内部的管理工作然后调用thread的run()方法。当start()方法返回,此时就会有
两个thread 并行地执行着,即初始的thread(发送start()消息的那个thread)与新开始的thread(即正在运行run()方法的那个thread)
在start()方法被调用之后,新的thread可说是活跃的(alive)。事实上,Thread class有一个isAlive()方法可指示thread所处的阶段:如果isAlive()方法返回true则该thread已经被启动并且正在运行run()这个method;如果isAlive()方法返回false则该thread可能还没有启动或者已经被终结了。
package java.lang
public class Thread implements Runnable {
public Thread();
public Thread(Runnable target);
public Thread(ThreadGroup group, Runnable target);
public Thread(String);
public Thread(ThreadGroup group,String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group,Runnable target, String name);
public Thread(ThreadGroup group,Runnable target,String name,long stackSize);
//影响thread生命周期method有如下:
public void start();
public void run();
public void stop();//已经废除,勿使用
public void resume();//已经废除,勿使用
public void suspend();//已经废除,勿使用
public static void sleep(long millis);
public static void sleep(long millis,int nanos);
public boolean isAlive();
public void interrupt();
public boolean isInterrupted();
public static boolean interrupted();
public void join() throws InterruptedException;
}
注意: Thread name
thread 的名称是在列出thread对象是所显示信息中的一部分。除此之外,他没什么重要性,所以对Thread命名是要让它在列出时显得有意义就好。默认的thread名称是
Thread-N 其中N是个唯一的数字。
所有的thread都有名称以用来在virtual machine 中进行识别。默认情况下,名称是由关于thread的信息所组成:它的priority 它的thread group与其他本章能够稍后讨论到的信息通过一定的算法一起计算得出来的一个数字和“Thread”这个单词组合而成。如果你高兴的话,你可以给thread不同的名称,或许此名称在列出时会有某种意义。
什么是并发性
答案:在同一时间执行多个TASK的能力
多线程应用例举:
用来阅读Email的程序是一组由计算机执行的指令列表,而播放音乐的程序也是这样。你可以在阅读EMAIL的同时聆听音乐是因为计算机在同时执行这两个指令列表。
事实上,实际发生的情况是计算机先执行一撮EMAIL应用程序的指令然后再执行一撮音乐播放程序的指令。计算机持续这样进行,反复在指令列表间交替进行,并且运行得很快以至于用户感觉上好像两个程序同时在运行。因为够快,所以实际上音乐并没有停顿。
____________________________________
如果计算机上刚好有一个以上的CPU,指令列表确实可以同时执行:即每个CPU可以执行一个指令列表.但是并不是要有多个CPU才能有并发执行的特征或者才能发挥threading的威力。
单一的CPU可以显现出平行执行运行指令的列表,让你同时阅读EMAIL和聆听音乐。所以thread就是大致上同时执行的一群task.
_________________________________________________________
为何要撰写具有多个thread的应用程序呢?为何不写成多个应用程序呢?答案就是因为thread是在同一个应用程序中运行,它们共享在计算机上相同的内存空间,这样可以让他们紧密地共享信息。上例中你的EMAIL程序与音乐播放程序并没有很好的互相沟通,最多你只是在两者之间复制与粘贴一些数据(像是文件的名称),如此就能够让EMAIL中的附件mp3
文件由鼠标点击后在音乐程序中播放,但也仅有MP3文件的名称在此两者之间共享而已。
什么是主线程
答案:
每个计算机程序(进程)都至少有一个thread:即(运行应用程序本身的thread).在java应用程序中,该Thread被成为“main thread(主线程)”,它是以执行class中main()这个method的第一个语句开始。在其他程序设计语言中开始点可能会不同,术语也会不一样,但基本的思想是一致的.
篇外话题:
对java应用程序来说,运行是从被运行的class的main()这个method开始的。那其他的java程序呢?
对applet、servlet与其他的J2EE程序来说,运行还是从该程序的main()方法开始,但在这种情况下,main()方法是属于Java plug-in 或 J2EE container的。这些container随后会通过事先就已经约定好的地址调用程序代码。这个地址在applet上时通过init()与start()这两个method来调用;servlet上是通过doGet()与doPost()这两个method来调用.
在任何情况下,程序都是相同的:程序代码的运行是以第一个语句开始并顺序地由单一的thread处理。
注意:不要被列出的绝对顺序给困扰了.将thread想作是一路运行下来的指令在概念上很有意义,但是在特定条件下顺序是可以改变的。