1、操作系统在执行一个程序时,会自动建立一个‘进程’,这个进程中,至少包含一个线程(这个线程被称为主线程),来作为程序入口。
2、操作系统运行中,会产生很多个‘进程’,这些进程不共享内存;而每个进程占有的内存,却可以被这个进程中不同的‘线程’所共享;另外,这些线程不仅共享这段内存,每个线程还可有一个属于它自己的内存空间——线程栈,这是线程建立时,操作系统分配的,用来保存线程数据。
3、线程总是属于某个进程,进程中的多个线程共享进程的内存。
4、进程被分为多个线程后,这些线程可以并发执行(并不是真正意义上的并发,而是线程调度造成的假象,详情参考相关操作系统教程)。
【JAVA线程】
1、由于Java是纯面向对象语言,因此,Java的线程模型也是面向对象的,Java通过Thread类将线程所必须的功能都封装了起来。
2、如果想运行自己的线程执行函数,那就要覆盖Thread类的run方法,即,继承Thread类,重写类里面的run()方法,run()里面写你要执行的代码。如下:
public class MyThread extends Thread
{
public void run()
{
//你的代码
}
}
3、执行的时候,实例化MyThread,然后调用start()方法;start方法负责建立线程,调用start方法后,如果线程建立成功,会自动调用Thread类的run方法,即开始执行你的代码。如下:
public static void main(String[] arg0)
{
MyThread myThread = new MyThread();
myThread.start();
}
5、通过继承Thread类来建立线程,虽然在实现起来更容易,但由于Java不支持多继承,如果这个线程类继承了Thread,就不能再继承其他的类了。因此,Java线程模型提供了通过实现Runnable接口的方法来建立线程,这样线程类可以在必要的时候继承和业务有关的类,而不是Thread类。
6、Runnable例子:
public class MyThread implements Runnable
{
public void run()
{
//your code
}
}
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
Thread t1 = new Thread(myThread1);
Thread t2 = new Thread(myThread2);
t1.start();
t2.start();
}
【Thread类的构造方法】
1、在使用Runnable接口时需要建立一个Thread实例,因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下:
public Thread();
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
Runnable target
实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。
String name
线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名子,线程就使用默认的线程名:Thread-N,N是线程建立的顺序,是一个不重复的正整数。
ThreadGroup group
当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。关于线程组的细节将在后面的章节详细讨论。
long stackSize
线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB。在x86平台下,默认的线程栈大小是12KB。
2、在调用start方法前后都可以使用setName设置线程名,但在调用start方法后使用setName修改线程名,会产生不确定性。
Reference:
http://www.blogjava.net/nokiaguy/archive/2009/03/07/258358.html 李宁的极乐世界-JAVA多线程初学者指南