一.进程与线程的概念
现在操作系统是多任务操作系统,而多线程是实现多任务的一种方式。
进程是指一个内存中运行的应用程序,没个进程都有一块独立的内存空间,一个进程中可以启动多个线程。比如在windows系统中,一个运行的exe就是一个进程。
线程是指进程中的一个执行流程,一个进程可以运行多个线程。比如java.exe进程中可以运行很多进程。线程总是属于某个进程,进程中的多个线程共享进程的内存。
“同时”执行是人的感觉,其实多个线程是轮换执行的。
二.java中的线程
在java中,“线程”是指两个不同的事情:
1、java.lang.Thread类的一个实例;
2、线程的执行。
使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。
一个Thread类实例只是一个对象,像java中的任何其他对象一样,具有变量和方法,生死与堆上。
java中,每一个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行着。
一个java应用总是从main()方法开始执行,main()方法运行在一个线程内,它被称为主线程。
一旦创建一个新的线程,就产生一个新的调用栈。
线程总体分两类:用户线程和守候线程。
当所有用户线程执行完毕的时候,JVM自动关闭。但守候线程却不独立与JVM,守候线程一般由操作系统或者用户自己创建的。
三.线程的创建与启动
1、扩展java.lang.Thread类
此类中有个run()方法,应该注意其用法:
public void run()
如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run()方法;否则,该方法不执行任何操作并返回。
Thread子类应该重写该方法。
2、实现java.lang.Runnable接口。
void run()
使用实现接口Runnable的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的run()方法。
方法run的常规协定是,它可能执行任何所需的操作。
四.实例化线程
1、如果是扩展java.lang.Thread类的线程,则直接new即可
2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:
Thread(Runnable target)//实现了Runnable接口的实例
Thread(Runnable target, String name)//String name 线程的名字。这个名字可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名字,线程使用默认的线程名:Thread-N,N是线程建立的顺序,是一个不重复的正整数。
Thread(ThreadGroup group, Runnable target) //ThreadGroup group 当前建立的线程所属的线程组(这里牵扯到线程组的概念)。如果不指定线程组,所有的线程都被加到一个默认的线程组中。
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)//long stackSize 线程栈的大小,这个值一般是cpu页面的整数倍。如x86的页面大小是4KB。在x86平台下,默认的线程大小是12kb