文档章节

Java线程:什么是线程

闪电
 闪电
发布于 2016/07/22 23:59
字数 949
阅读 60
收藏 6

一、什么是线程

线程是指令的执行路径。在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 线程执行完成

本文转载自:http://thomaschen2011.iteye.com/blog/1467403

闪电
粉丝 75
博文 392
码字总数 6789
作品 0
海淀
技术主管
私信 提问
15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多...

LCZ777
2014/05/27
0
0
java中高级大公司多线程面试题

1)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? lock接口在多线程和并发编...

java成功之路
2018/10/30
0
0
Java中ThreadLocal的设计与使用

ThreadLocal是什么 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更...

DragonRace
2013/11/25
0
0
探究ThreadLocal原理(基于Java8)

线程封闭 避免并发最简单的方法就是线程封闭。 即把对象封装到一个线程里,只有这一个线程能看到此对象。那么这个对象就算不是线程安全的也不会出现任何安全问题。 使用ThreadLocal是实现线程...

芥末无疆
2018/02/10
0
0
java面试必备之ThreadLocal

按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低系统的并发性能,此外代码同步解...

编程老司机
2018/05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

任务调度-第三方库Quartz实现分布式任务管理与调度

1. 为什么要用第三方库Quartz来实现分布式任务管理和调度? 首先管理的目的是通过集群多节点的管理提供容错,调度的目的是保证同一任务只会被完整执行一次;之前分享过的任务调度-单体应用定...

秋日芒草
13分钟前
0
0
Mysql Explain Type

前言 当我们执行sql,一般都会用Explain来查看sql的效率如何。今天在看sql执行效率的时候,忘记了其中Type的意思,现在在此记录一下。 效率 这里的type指的是访问类型,各个效率高低如下: ...

无敌小杰杰
21分钟前
0
0
外部浏览器网页复制公众号无法自动唤起微信并关注怎么办?

现在有很多用户在外部浏览器网页复制公众号时无法自动唤起微信并关注,这是因为第三方浏览器打开微信的接口,微信只给部分合作平台开放了接口权限,任何第三方想调用只能是通过一些技术手段来...

qjniop
26分钟前
0
0
建造者模式

建造者模式(Builder Pattern) 也叫生成器模式,其定义如下: Separate the construction of a complex object from its representation so that the same construction process can create d......

无知的小狼
31分钟前
0
0
距离计算方法

1、欧式距离(欧几里得距离) 欧式距离是最易理解的距离定义,即各坐标点的坐标之差的平方和相加,然后开根号。 二维平面上点 与点 之间的距离公式是: n维空间上点 和点 之间的距离公式是:...

城北徐公美
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部