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()方法检测该对象上是否有等待的线程,若有则使其全部进入就绪状态。没有则不进行任何操作。

  

java线程(一)的更多相关文章

  1. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  2. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  3. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  4. 细说进程五种状态的生老病死——双胞胎兄弟Java线程

    java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...

  5. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  6. 第24章 java线程(3)-线程的生命周期

    java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...

  7. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  8. 第22章 java线程(2)-线程同步

    java线程(2)-线程同步 本节主要是在前面吃苹果的基础上发现问题,然后提出三种解决方式 1.线程不安全问题 什么叫线程不安全呢 即当多线程并发访问同一个资源对象的时候,可能出现不安全的问题 对于前 ...

  9. 第21章 java线程(1)-线程初步

    java线程(1)-线程初步 1.并行和并发 并行和并发是即相似又有区别: 并行:指两个或者多个事件在同一时刻点发生. 并发:指两个或多个事件在同一时间段内发生 在操作系统中,并发性是指在一段事件内宏 ...

  10. [转]Java线程安全总结

    最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: java线程安全,java垃圾收集,java并发包详细介绍,java profi ...

随机推荐

  1. Nginx uWSGI web.py 站点搭建

    一.安装nginx 在安装nginx前,需要先装nginx的依赖包. 1.如果没有yum则先安装yum   删除原有的yum  rpm -aq|grep yum|xargs rpm -e --node ...

  2. mybatis源码跟踪

    第一步:从web.xml进入dispatcherServlet进入前端控制器 第二步:使用handlerMapping 获得handlerChain 第三步:使用适配器执行handler获取model ...

  3. 微信小程序-开发入门

    微信小程序已经火了一段时间了,之前一直也在关注,就这半年的发展来看,相对原生APP大部分公司还是不愿意将主营业务放到微信平台上,以免受制于腾讯,不过就小程序的应用场景(用完即走和二维码分发等)还是很值 ...

  4. C#实现不影响当前线程情况下间隔一定的时间执行一段代码

    大家知道C#间隔一定时间去执行一段代码,常用的有 1. Thread.Sleep(多少毫秒); 2. 使用Timer控件间隔一定的时间,设置执行一次 以上两种方法,实现起来不难,弊端在于会阻塞当前线程 ...

  5. Dive in python Chapter4 实例

    def info(object,spacing=10,collapse=1): """Print methods and doc strings. Takes modul ...

  6. 初步认识Thymeleaf:简单表达式和标签。(一)

    本文只适用于不会Java对HTML语言有基础的程序员们,是浏览了各大博客后收集整理,重新编辑的一篇文章,希望能对大家有所帮助. 对于Thymeleaf,网上特别官方的解释无非就是:网站或者独立应用程序 ...

  7. 关于JavaScript中连等赋值那点事

    今天看了前端网上关于JS的题目,其中有一道题目挺有意思的.如下 var a = b =10; (function(){ var a = b = 20; })(); console.log(a); co ...

  8. java随机数生成的原理

    一.在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机,这个在 ...

  9. C语言使用clock进行计时

    #include "stdio.h" #include "stdlib.h" #include "time.h" int main( voi ...

  10. 老李分享:Uber究竟是用什么开发语言? 2

    Uber的任务分派系统是运行在Node上,这是一个运行在服务器端的JavaScript平台.当一个客户打开app或者网站来进行车辆预定或者调用其他的API来查看可用车辆信息的时候,大部分的这些服务都是 ...