`

Java线程:什么是线程

 
阅读更多

一、什么是线程

线程是指令的执行路径。在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线程:两种传统的实现方式.zip

    本文将深入探讨两种传统的Java线程实现方式,并通过一个具体的例子来阐述如何创建和管理这些线程。 首先,我们来看第一种线程实现方式:继承`Thread`类。当你创建一个新的类继承自`java.lang.Thread`,你可以重写它...

    java 多线程:哲学家思考问题

    java 多线程 哲学家思考问题 java 多线程 哲学家思考问题 ...java 多线程 哲学家思考问题java 多线程 哲学家思考问题java 多线程 哲学家思考问题java 多线程 哲学家思考问题 java 多线程 哲学家思考问题

    java多线程编程总结

    #### 一、Java线程:概念与原理 - **操作系统中线程和进程的概念** 当前的操作系统通常都是多任务操作系统,多线程是一种实现多任务的方式之一。在操作系统层面,进程指的是内存中运行的应用程序,每个进程拥有...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...

    Java多线程机制(讲述java里面与多线程有关的函数)

    9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行抽象的。每个Java程序都有一个主线程,即由JVM启动并执行main方法的线程。线程代表了程序中的执行流,可以在不同的线程之间切换以共享CPU时间...

    Java_多线程编程线程:大总结

    - **Java线程的分类**:Java线程主要分为用户线程和守护线程。用户线程的结束会直接影响JVM的生命周期,而守护线程通常由系统或库管理,如垃圾回收线程。 #### 三、Java线程的创建与启动 Java提供了两种主要的方式...

    JAVA单线程多线程

    ### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...

    Java多线程

    通过使用`Callable`接口和`FutureTask`类,Java线程可以返回结果。这种方式比传统使用`Thread`类更加灵活。 #### 十四、Java线程:新特征-锁(上) Java提供了一套高级的锁机制,如`ReentrantLock`,这允许更精细...

    java多线程Demo

    Java线程有10个优先级(MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY),默认优先级是NORM_PRIORITY。但是,线程优先级并不保证绝对的执行顺序,操作系统调度策略可能影响实际执行顺序。 7. join()方法: 一个线程...

    java线程.pdf

    根据提供的信息,我们可以推断出这份文档主要关注的是Java线程的相关内容。下面将围绕“Java线程”这一主题展开详细的介绍与解释。 ### Java线程基础 在Java语言中,线程是程序执行流的基本单元。一个标准的Java...

    java 线程工具类 java 线程工具类

    java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具类 java 线程工具类java 线程工具...

    java线程分析工具TDA

    Java线程分析是Java开发中的重要环节,尤其是在处理性能优化、死锁排查或者并发问题时。TDA(Thread Dump Analyzer)是一款强大的Java线程分析工具,它能够帮助开发者深入理解应用在运行时的线程状态,包括线程的...

    Java线程状态流转图

    Java线程状态流转图知识点总结 Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换...

Global site tag (gtag.js) - Google Analytics