Java线程:什么是线程

一、什么是线程

线程是指令的执行路径。在Java语言中,线程无处不在,每一个计算机程序最少都有一个线程。例如下面的程序

 

Java代码   收藏代码
  1. package study.thread.chapter2.example1;  
  2.   
  3.   
  4. /** 
  5.  * calculate the factorial of a number which is inputed from standard console 
  6.  *  
  7.  */  
  8. public class Factorial {  
  9.       
  10.     public static void main(String[] args) {  
  11.                   
  12.         int n = Integer.parseInt(args[0]);  
  13.   
  14.         System.out.print(n + "! is ");  
  15.   
  16.         int fact = 1;  
  17.   
  18.         while (n > 1) {  
  19.             fact *= n--;  
  20.         }  
  21.   
  22.         System.out.println(fact); // the result of n!  
  23.           
  24.         System.out.println(Thread.currentThread().getName()); //  
  25.     }  
  26.   
  27. }  

 

在java语言中,上面这段程序由一个所谓的main线程来执行的,其开始点是main方法里面的第一条语句(使用Eclipse Debug功能,可以清晰的从Debug Tab窗口中看到这个线程),这个线程和其他线程的不同点在于,其执行开始点是main方法中的第一条指令;而其他的线程执行开始点是run方法中的第一条指令。在Java应用中,所有的Java应用的起点都是main这个单线程,对于控制台的Java应用自是不必说了。对于Applet,J2EE呢?也是如此,只是你的code是作为plugin插入那些框架中执行,受那些容器,框架的管理,而那些框架也是从main开始的。

 

对于Java线程而言:

 

  • 每个线程都有一块儿自留地,用以存放local的变量
  • 整个JVM Heap中的对象为线程所共享,线程可以透明的访问他们。


Java线程:什么是线程_第1张图片

 

二、线程的创建

在JVM中,Thread类的一个instance就代表一个线程,每一个线程都有这样一个相关的对象。这是创建Thread Instance是创建线程的唯一方式。只有通过呼叫这个Instance的start方法,才可以启动一个线程。Runnable接口只是定义了任务接口,其实现是一个任务的指令序列集合。这个任务要变成一个线程运行起来,则必须作为参数传入到Thread的构造函数中,以创建Thread类的一个instance。

Java代码   收藏代码
  1. public class CreateThread {  
  2.       
  3.     //JVM创建main线程  
  4.     public static void main(String[] args) {  
  5.           
  6.         //创建Thread的instance,来代表创建一个线程  
  7.         Thread ext = new ExtendsThread();  
  8.           
  9.         //创建Thread的instance,来代表创建一个线程  
  10.         Thread imp = new Thread(new RunnableImpl());  
  11.           
  12.         //启动线程  
  13.         ext.start();  
  14.         imp.start();          
  15.     }  
  16.       
  17.     //继承Thread来定义任务  
  18.     public static class ExtendsThread extends Thread{  
  19.         @Override public void run(){  
  20.             System.out.println("I'm ExtendsThread");  
  21.         }  
  22.     }  
  23.       
  24.     //实现Runnable接口来定义任务  
  25.     public static class RunnableImpl implements Runnable {  
  26.         @Override public void run() {  
  27.             System.out.println("I'm RunableImpl");            
  28.         }         
  29.     }  
  30. }  

看上面的例子:

  • 一共有3个线程,一个main线程,是由JVM创建,其执行开始点是main方法中的第一条语句,在main线程中又创建了2个线程,其中一个继承自Thread,另一个实现Runnable接口,外包Thread的Object的外套。
  • Java语言中,没有父线程,子线程之说,线程一旦创建,就开始独立的,和原线程并发执行。具体的由哪个线程会占用CPU,执行代码,由JVM负责调度

三、线程的生命周期

Java线程:什么是线程_第2张图片

上图为一个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 线程执行完成

 

你可能感兴趣的:(Java线程:什么是线程)