一、什么是线程
线程是指令的执行路径。在Java语言中,线程无处不在,每一个计算机程序最少都有一个线程。例如下面的程序
package study.thread.chapter2.example1;
/**
* calculate the factorial of a number which is inputed from standard console
*
*/
public class Factorial {
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
System.out.print(n + "! is ");
int fact = 1;
while (n > 1) {
fact *= n--;
}
System.out.println(fact); // the result of n!
System.out.println(Thread.currentThread().getName()); //
}
}
在java语言中,上面这段程序由一个所谓的main线程来执行的,其开始点是main方法里面的第一条语句(使用Eclipse Debug功能,可以清晰的从Debug Tab窗口中看到这个线程),这个线程和其他线程的不同点在于,其执行开始点是main方法中的第一条指令;而其他的线程执行开始点是run方法中的第一条指令。在Java应用中,所有的Java应用的起点都是main这个单线程,对于控制台的Java应用自是不必说了。对于Applet,J2EE呢?也是如此,只是你的code是作为plugin插入那些框架中执行,受那些容器,框架的管理,而那些框架也是从main开始的。
对于Java线程而言:
- 每个线程都有一块儿自留地,用以存放local的变量
- 整个JVM Heap中的对象为线程所共享,线程可以透明的访问他们。
二、线程的创建
在JVM中,Thread类的一个instance就代表一个线程,每一个线程都有这样一个相关的对象。这是创建Thread Instance是创建线程的唯一方式。只有通过呼叫这个Instance的start方法,才可以启动一个线程。Runnable接口只是定义了任务接口,其实现是一个任务的指令序列集合。这个任务要变成一个线程运行起来,则必须作为参数传入到Thread的构造函数中,以创建Thread类的一个instance。
public class CreateThread {
//JVM创建main线程
public static void main(String[] args) {
//创建Thread的instance,来代表创建一个线程
Thread ext = new ExtendsThread();
//创建Thread的instance,来代表创建一个线程
Thread imp = new Thread(new RunnableImpl());
//启动线程
ext.start();
imp.start();
}
//继承Thread来定义任务
public static class ExtendsThread extends Thread{
@Override public void run(){
System.out.println("I'm ExtendsThread");
}
}
//实现Runnable接口来定义任务
public static class RunnableImpl implements Runnable {
@Override public void run() {
System.out.println("I'm RunableImpl");
}
}
}
看上面的例子:
- 一共有3个线程,一个main线程,是由JVM创建,其执行开始点是main方法中的第一条语句,在main线程中又创建了2个线程,其中一个继承自Thread,另一个实现Runnable接口,外包Thread的Object的外套。
- Java语言中,没有父线程,子线程之说,线程一旦创建,就开始独立的,和原线程并发执行。具体的由哪个线程会占用CPU,执行代码,由JVM负责调度
三、线程的生命周期
上图为一个Thread的状态变迁图,需要说明的一点是RUNNING只是为了说明问题的方便性,而虚构的一个Thread的状态,在JVM中一个Thread只有如下几种状态。
NEW
|
刚刚new一个Thread的实例 |
RUNNABLE
|
处于NEW状态Thread的实例,通过start()来启动线程。这是线程就处于可运行态,他随时都有可能被JVM调度到CPU去执行其中的代码 |
BLOCKED
|
正在执行的线程,如果遇到等待monitor lock,就进入BLOCKED状态 |
WAITING
|
正在执行的线程,入到如下的指令,就进入该状态:
- Object.wait()
- Thread.join()
- LockSupport.park()
|
TIMED_WAITING
|
正在执行的线程,入到如下的指令,就进入该状态:
- Thread.sleep(long)
- Object.wait(long)
- Thread.join(long)
- LockSupport.parkNanos
- LockSupport.parkUntil
|
TERMINATED
|
线程执行完成 |
- 大小: 63.7 KB
- 大小: 94.3 KB
分享到:
相关推荐
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程状态的转换 Java线程:线程的同步与锁 一、同步问题提出 二、同步和锁定 三、静态方法同步 四、如果线程不能不能获得锁会怎么样 五、何时需要同步...
Java线程:线程状态的转换.pdf
主要讲述java线程volatile关键字
JAVA语言实现:编写10个线程,第一个线程从1加到10,第二个线程从11加到20...第十个线程从91加到100,最后再把十个线程结果相加
Java线程:线程状态的转换[参考].pdf
初学者学习java多线程的必备良师啊!! 该文档内容简单易懂 条理清晰 !! 内容包含:线程的状态及状态之间的转换 线程的优先级 线程的几大常用方法! 申明: 本文出自 “熔 岩” 博客,本人从百度文库转载而来! 大家都...
java 多线程 哲学家思考问题 java 多线程 哲学家思考问题 ...java 多线程 哲学家思考问题java 多线程 哲学家思考问题java 多线程 哲学家思考问题java 多线程 哲学家思考问题 java 多线程 哲学家思考问题
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...
Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解
Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程Java线程
Java线程Java线程Java线程Java线程Java线程Java线程
4初学Java多线程:线程的生命周期.pdf