java线程基础

什么是线程?

  这里引用百度百科的一句话:“线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。”,简单来说线程cpu执行程序调度的最小单元。cpu通过调用执行一个个线程来促使程序能够正常运行。

线程、进程、应用程序之间的关系

  在操作系统中一个进程就代表一个应用程序,如果将一个应用程序看做成一个实体的话,那进程就是一个正在运行的实体。一个应用程序中可以包含多个线程,同样进程中也可以包含多个线程,多个线程的组合称为了一个应用程序,如果一个应用程序中只有一个线程时,那改线程就是一个用用程序,我们称之为单线程程序!

java中如何创建线程

  在java中有两种创建线程的方式,一种是实现Runnable接口的run()方法并将其对象实例传入Thread构造中来创建线程,一种是扩展Thread类的run方法来创建线程

         new Thread(new Runnable() {
public void run() {
//省略该线程要执行的代码
}
}).start();

实现Runnable接口的方式

new Thread(){
@Override
public void run() {
//省略该线程要执行的代码
super.run();
}
}.start();

扩展Thread类的方式

Thread类是java API提供的线程类,其通过start()方法来启动线程,在线程启动后执行run()方法中的代码,当run()方法中的代码执行完成后线程结束。在以上两种创建线程的方式中推荐使用实现Runnable接口的方式创建线程,因为这种方式更符合面向对象思想,且不会破坏java API原有代码的设计结构,扩展Thread类的方式不仅破坏了Java API原有的设计结构且不符合面向对象的设计思想。而且在Thread类的原始run()方法中也是调用Runable接口的run()方法来实现线程内容代码的调用。

线程的几种状态

  线程大致上可以分为五种状态:创建、可运行(就绪)、阻塞(挂起)、运行、死亡。

  创建:通过new Thread()来创建线程实例,但未调用start()方法。这时线程的实例已经被创建出来,但并没有启动该线程。

  就绪:线程实例创建后调用start()方法。这时线程已经启动,可以被JVM调度交由cpu执行,但cpu目前并没有执行该线程。

  运行:线程已经启动,且已被JVM调度交由cpu执行,cpu正在执行该线程。

  阻塞:线程在运行时,调用线程对象的sleep()、join()方法或该线程已锁定的监视对象的wait()方法时现场进入阻塞状态,知道达到某种条件后进入就绪状态。

  死亡:当线程对象的run()方法执行结束,或在执行过程中出现错误导致线程异常结束,这时线程处于死亡状态。

改变线程状态的几种方法详解

线程对象产生的方法

  sleep():sleep方法使线程放弃cpu的使用权进入休眠状态一段时间,这段时间过后线程自动进入就绪状态。

  join():join()方法使线程放弃cpu的使用权并加入另一该线程,当另一个线程运行结束进入死亡状态后该线程自动进入就绪状态,否则将一直处于阻塞状态。

  yield():yield()方法使线程暂时放弃cpu的使用权进入就绪状态,但由于cpu的调度是随机的无法干预的所以有时yield()方法起不到任何效果。

  start():start()方法使线程对象启动进入就绪状态。注意:start()方法只能在线程实例创建后调用一次,当线程进入死亡状态时则无法再调用start()方法使其进入就绪状态。  

线程锁定监视对象产生的方法

  wait():wait()方法使当前线程放弃cpu的使用权和该对象的锁,进入阻塞状态知道其他线程调用该对象的notify()或notifyall()方法后进入就绪状态。

  notify():notify()方法检测该对象上是否有等待的线程,若有一个或多个则随机挑选一个线程使其进入就绪状态。没有则不进行任何操作。

  notifyall():notifyall()方法检测该对象上是否有等待的线程,若有则使其全部进入就绪状态。没有则不进行任何操作。

  

最新文章

  1. lecture2-NN结构的主要类型的概述和感知机
  2. 通过生产者消费者模式例子讲解Java基类方法wait、notify、notifyAll
  3. GCD 多线程 初探
  4. python sys.argv[]
  5. Alpha、 Beta、build、release测试
  6. lua IDE for cocos2d-x development
  7. Windows Azure 安全最佳实践 - 第 7 部分:提示、工具和编码最佳实践
  8. 最近一段OI学习计划
  9. 关于struts2 Could not find action or result错误
  10. 理解Python迭代对象、迭代器、生成器
  11. 自己动手写web框架----1
  12. OO第一次博客
  13. margin:0 auto是什么意思
  14. 今天我们来聊聊svn的使用
  15. 小白的CTF学习之路1——程序与CPU
  16. VC++环境下单文档SDI与OpenGL多视图分割窗口的实现-类似3DMAX的主界面
  17. 1.strcpy使用注意
  18. 51Nod 1090: 3个数和为0
  19. Apt-Cacher-ng 搭建缓存服务器
  20. Apache Spark : RDD

热门文章

  1. php线程安全与非线程安全版的区别
  2. springmvc框架原理
  3. java中有符号和无符号数据类型发生转换
  4. ORACLE 12C 基础
  5. Android两种为ViewPager+Fragment添加Tab的方式
  6. CSS.01 -- 选择器及相关的属性文本、文字、字体、颜色、
  7. ActiveMQ Part 1 : 基本安装配置(windows 版本)
  8. JIRA6.36-7.23数据迁移文档
  9. 核心模块Path
  10. Flash加载ini文件!