Java线程
线程
- 线程
线程(Thread)是控制线程(Thread of Control)的缩写,是程序运行的基本单位,它是具有一定顺序的指令序列(即所编写的程序代码)、存放方法中定义局部变量的栈和一些共享数据。线程是相互独立的,每个方法的局部变量和其他线程的局部变量是分开的,因此,任何线程都不能访问除自身之外的其他线程的局部变量。如果两个线程同时访问同一个方法,那每个线程将各自得到此方法的一个拷贝。
- 多线程
多进程:多线程实现后台服务程序可以同时处理多个任务,并不发生阻塞现象。多线程是Java 语言的一个很重要的特征。多线程程序设计最大的特点就是能够提高程序执行效率和处理速度。Java 程序可同时并行运行多个相对独立的线程。
- 进程
进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守候线程都结束运行后才能结束。
实现
Java提供了两种实现线程的方法
- 实现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
}
}
- 派生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.io、http://www.cnblogs.com/yzg1/
如果觉得本文不错的话,帮忙点击下面的推荐哦,谢谢!
Java线程的更多相关文章
- Java线程并发:知识点
Java线程并发:知识点 发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用. 逃逸:在对象尚未准备 ...
- Java线程的概念
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- 细说进程五种状态的生老病死——双胞胎兄弟Java线程
java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...
- 【转载】 Java线程面试题 Top 50
Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...
- 第24章 java线程(3)-线程的生命周期
java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- 第22章 java线程(2)-线程同步
java线程(2)-线程同步 本节主要是在前面吃苹果的基础上发现问题,然后提出三种解决方式 1.线程不安全问题 什么叫线程不安全呢 即当多线程并发访问同一个资源对象的时候,可能出现不安全的问题 对于前 ...
- 第21章 java线程(1)-线程初步
java线程(1)-线程初步 1.并行和并发 并行和并发是即相似又有区别: 并行:指两个或者多个事件在同一时刻点发生. 并发:指两个或多个事件在同一时间段内发生 在操作系统中,并发性是指在一段事件内宏 ...
- [转]Java线程安全总结
最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: java线程安全,java垃圾收集,java并发包详细介绍,java profi ...
随机推荐
- JDK安装源码src和doc
(1)src 打开JDK的安装目录如(C:\Program Files\Java\jdk1.8.0_91)有一个src.zip的压缩文件,这个压缩文件里就是源码. mkdir src copy src ...
- ExtJS4 源码解析(一)带项目分析
Ext这个东东太大了,能看完就已经很不错了,完整的源码分析就不敢说了,大概就涉及了类管理,事件管理,数据结构缓存架构,UI组件核心机制,MVC这几个方面,只是挑着源码看的,没有实际完整的使用. 公司的 ...
- 深入理解脚本化CSS系列第三篇——脚本化CSS类
前面的话 在实际工作中,我们使用javascript操作CSS样式时,如果要改变大量样式,会使用脚本化CSS类的技术,本文将详细介绍脚本化CSS类 style 我们在改变元素的少部分样式时,一般会直接 ...
- 深入学习jQuery选择器系列第七篇——表单选择器
× 目录 [1]表单元素 [2]对象属性 前面的话 无论是提交还是传递数据,表单元素在动态交互页面的作用是非常重要的.jQuery专门加入了表单选择器,从而能够极其方便地获取到某个类型的表单元素 表单 ...
- .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...
- Visual Studio常用小技巧一:代码段+快捷键+插件=效率
用了visual studio 5年多,也该给自己做下备忘录了.每次进新的组换新的电脑,安装自己熟悉的环境又得重新配置,不做些备忘老会忘记一些东西.工具用的好,效率自然翻倍. 1,代码段 在Visua ...
- geotrellis使用(五)使用scala操作Accumulo
要想搞明白Geotrellis的数据处理情况,首先要弄清楚数据的存放,Geotrellis将数据存放在Accumulo中. Accumulo是一个分布式的Key Value型NOSQL数据库,官网为( ...
- 使用phpstorm来进行svn提交
macbook上找一款好用的免费的SVN真是难呀,要么就是非常模糊的画面,本想用Xcode的,但是折腾了一会想打开一个php项目文件夹,不会搞.最后想还是用phpstorm吧.没想到还挺好用的. 首先 ...
- Unicode与JavaScript详解
本文为转载内容 一.Unicode是什么? Unicode源于一个很简单的想法:将全世界所有的字符包含在一个集合里,计算机只要支持这一个字符集,就能显示所有的字符,再也不会有乱码了. 它从0开始,为每 ...
- [Java IO]03_字符流
Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类. 它的定义如下: public abstra ...