线程

  1. 线程

线程(Thread)是控制线程(Thread of Control)的缩写,是程序运行的基本单位,它是具有一定顺序的指令序列(即所编写的程序代码)、存放方法中定义局部变量的栈和一些共享数据。线程是相互独立的,每个方法的局部变量和其他线程的局部变量是分开的,因此,任何线程都不能访问除自身之外的其他线程的局部变量。如果两个线程同时访问同一个方法,那每个线程将各自得到此方法的一个拷贝。

  1. 多线程

多进程:多线程实现后台服务程序可以同时处理多个任务,并不发生阻塞现象。多线程是Java 语言的一个很重要的特征。多线程程序设计最大的特点就是能够提高程序执行效率和处理速度。Java 程序可同时并行运行多个相对独立的线程。

  1. 进程

进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守候线程都结束运行后才能结束。

实现

Java提供了两种实现线程的方法

  1. 实现Runnable接口

    Runnable 接口提供了run()方法的原型,因此创建新的线程类时,只要实现此接口,即只要特定的程序代码实现Runnable 接口中的run()方法,就可完成新线程类的运行。
  • 创建一个实现Runnable 接口的类,并且在这个类中重写run 方法。

class ThreadType implements Runnable{

public void run(){

……

}

}

  • 使用关键字new 新建一个ThreadType 的实例

Runnable threadName = new ThreadType ();

  • 创建线程(threadOb 是一个实现Runnable 接口的类的实例;threadName指定新线程的名字)

Thread(Runnable threadOb,String threadName);

  • 启动线程

threadName.start();

实例:

public class RunnableDemo implements Runnable {
public void run(){
for (int count = 1,row = 1; row < 10; row++,count++) //循环计算输出的*数目
{
for (int i = 0; i < count; i++) //循环输出指定的count 数目的*
{
System.out.print('*'); //输出*
}
System.out.println(); //输出换行符
}
} public static void main(String argv[ ]){
Runnable rb = new RunnableDemo(); //创建,并初始化RunnableDemo 对象rb
Thread td = new Thread(rb); //通过Thread 创建线程
td.start(); //启动线程td
} }
  1. 派生Thread类

    继承Thread 类并覆盖Thread 类的run 方法完成线程类的声明,通过new 创建派生线程类的线程对象。
  • 创建一个新的线程类,继承Thread 类并覆盖Thread 类的run()方法

class ThreadType extends Thread{

public void run(){

……

}

}

  • 创建线程

ThreadDemo threadName = new ThreadDemo();

  • 启动线程

threadName.start();

实例:

public class ThreadDemo extends Thread {
//重载run 函数
public void run() {
for (int count = 1,row = 1; row < 10; row++,count++) //循环计算输出的*数目
{
for (int i = 0; i < count; i++) //循环输出指定的count 数目的*
{
System.out.print('*'); //输出*
}
System.out.println(); //输出换行符
}
}
public static void main(String argv[ ]){
ThreadDemo td = new ThreadDemo(); //创建,并初始化ThreadDemo类型对象td
td.start(); //调用start()方法执行一个新的线程
}
}

线程周期

一个线程有 4 种状态,任何一个线程都处于这4 种状态中的一种状态。

  • 创建(new)状态:调用new 方法产生一个线程对象后、调用start 方法前所处的状态。线程对象虽然已经创建,但还没有调用start 方法启动,因此无法执行。当线程处于创建状态时,线程对象可以调用start 方法进入启动状态,也可以调用stop 方法进入停止状态。
  • 可运行(runnable)状态:当线程对象执行start()方法后,线程就转到可运行状态。进入此状态只是说明线程对象具有了可以运行的条件,但线程并不一定处于运行状态。因为在单处理器系统中运行多线程程序时,一个时间点只有一个线程运行,系统通过调度机制实现宏观意义上的运行线程共享处理器。因此一个线程是否在运行,除了线程必须处于Runnable 状态之外,还取决于优先级和调度。
  • 不可运行(non Runnable)状态:线程处于不可运行状态是由于线程被挂起或者发生阻塞,例如对一个线程调用wait()函数后,它就可能进入阻塞状态;调用线程的notify 或notifyAll 方法后它才能再次回到可执行状态。
  • 退出(done)状态:一个线程可以从任何一个状态中调用stop 方法进入退出状态。线程一旦进入退出状态就不存在了,不能再返回到其他的状态。除此之外,如果线程执行完run 方法,也会自动进入退出状态。

    来看菜鸟教程的一张图:

线程状态转换函数

注意:stop()、suspend()和resume()方法现在已经不提倡使用,这些方法在虚拟机中可能引起“死锁”现象。suspend()和resume()方法的替代方法是wait()和sleep()。线程的退出通常采用自然终止的方法,建议不要人工调用stop()方法。

我的博客:http://bigdots.github.iohttp://www.cnblogs.com/yzg1/

如果觉得本文不错的话,帮忙点击下面的推荐哦,谢谢!

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. Jser 设计模式系列之面向对象 - 接口封装与继承

    GOF在<设计模式>中说到:面向接口编程,而非面向实现编程 鉴于此,这个概念可见一斑! JS却不像其他面向对象的高级语言(C#,Java,C++等)拥有内建的接口机制,以确定一组对象和另一 ...

  2. Android NDK开发Hello Word!

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...

  3. n维数组实现(可变参数表的使用)

    首先先介绍一下可变参数表需要用到的宏: 头文件:#include<cstdarg> void va_start( va_list arg_ptr, prev_param ); type v ...

  4. 搞清arguments,callee,caller

    arguments是什么? arguments是函数调用时,创建的一个类似的数组但又不是数组的对象,并且它存储的是实际传递给函数的参数,并不局限于函数声明的参数列表哦. 尼玛,什么意思? 写个demo ...

  5. .Net处理Oracle中Clob类型字段总结

    最近在做项目中用到Clob这个字段,Clob是存储无限长字符的Oracle字段,用的时候网上找资料找了好久,内容不是很多,大部分都不能用,当然也有可以用的,测试了不同版本,整理了一下,给大家在做项目的 ...

  6. PHP环境配置-从Apache官网下载windows版apache服务器

    由于个人有强迫倾向,下载软件都喜欢从官网下载,摸索了好久终于摸清楚怎么从Apache官网下载windows安装版的Apache服务器了,现在分享给大家. 进入apache服务器官网http://htt ...

  7. C# 将PDF文件转换为word格式

    Pdf(Portable Document Format)意为“便携式文档格式”,是现在最流行的文件格式之一,它有很多优点如:尺寸较小.阅读方便.操作系统平台通用等,非常适合在网络上传播和使用.如今在 ...

  8. Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...

  9. Cesium应用篇:1快速搭建

    范例中所有范例可以在Github中搜索:ExamplesforCesium Cesium ['siːzɪəm]是一款开源的JavaScript开源库,开发者通过Cesium,实现无插件的创建三维球和二 ...

  10. 符合我公司GIS开源解决方案的探讨

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 这一周,我对GIS开源解决方案中涉及到的开源软件以及相关技术 ...