转:-----------------http://softstone.javaeye.com/blog/172911
一、进程、线程
进程通常是一个程序的实例。但进程是不活动的,必须有一个线程,线程负责执行地址空间中的进程代码。一个进程可以同时运行多个线程,每个线程拥有自己的堆栈、
CPU
寄存器和
CPU
时间。多个线程共享进程占有的资源,比如地址空间、动态内存、文件等。
Java
虚拟机中线程可以粗略的如下表示:
Java Virtual Machine ------------------|-----Thread1---->Local Variables
|-----
Thread1---->Local Variables
Global Memory································· |-----
Thread1---->Local Variables
可以看到,每个线程有自己的本地变量,同时也共享在
Java
虚拟机中的全局存储。
二、创建线程
Java中创建线程又两种方式,一种是继承Thread类,一种是实现Runnable接口。对于Thread的继承类,直接new即可,对于Runnable的实现类,用这个接口的实现类来new一个线程。
代码示例如下:
//继承Thread类
public class FirstThread extends Thread {
//
需要继承run方法
public void run() {
try {
for (int i = 0; i < 20; i++) {
sleep(500);
System.out.println(getName());
}
} catch (InterruptedException e) {
//
处理线程被终止的情况
e.printStackTrace();
}
}
}
//实现Runnable接口
public class SecondThread implements Runnable {
//Runnable
接口只有一个run方法,必须实现。
public void run() {
try {
for (int i = 0; i < 20; i++) {
Thread.sleep(400);
System.out.println(Thread.currentThread().getName());
}
} catch (InterruptedException e) {
//
处理线程被终止的情况
e.printStackTrace();
}
}
}
//执行线程
FirstThread t1 = new FirstThread();
t1.setName("thread1");
FirstThread t2 = new FirstThread();
t2.setName("thread2");
SecondThread r1 = new SecondThread();
Thread t3 = new Thread(r1);
Thread t4 = new Thread(r1);
t3.setName("thread3");
t4.setName("thread4");
t1.start();
t2.start();
t3.start();
t4.start();
需要注意,线程的执行必须使用start方法。
三、线程和对象
在Java中,创建线程是通过创建一个线程对象实现的,这就容易让人混淆,线程和对象有什么关系吗?其实两者之间没有关系。
线程是一个动态的概念,一个执行的概念,在Java虚拟机中,线程可以看作是一组语句的执行序列。
对象是一种封装方式,在Java中,一切都是对象,线程也需要通过对象来表达。Thread class也仅仅是一个对象,可以被其他的线程对象引用,其中的方法既可以被自身表达的线程所执行,也可以被其他的线程所执行。
四、线程的生命周期
该图截自
sun
网站
线程启动:调用
start
()方法启动线程
线程运行:线程启动后运行
run
()方法体内代码
线程阻塞:线程
sleep()
,
wait
线程结束:自让运行完毕退出。
线程的终止
两种终止方法。
一种是自然终止,run方法执行完退出。比如:
public void run( ) {
while (!done) {
...
}
}
另一种是调用Thread.interrupt()方法,中断wait()或Sleep方法,终止线程。
public void run() {
try {
for (int i = 0; i < 400; i++) {
Thread.sleep(400);
System.out.println(Thread.currentThread().getName());
}
} catch (InterruptedException e) {
//
处理线程被终止的情况
e.printStackTrace();
}
}
Thread.interrupt()
方法会导致sleep、join或wait等方法抛出InterruptedException异常,在catch
InterruptedException的方法中,退出线程,但是线程在执行任务的时候是不会抛出InterruptedException。
其他两个方法
Thread.interrupted()
检查线程的中断状态,同时清除中断状态。
Thread.isInterrupt()
检查当前线程是否出于中断状态。