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 ...
随机推荐
- SSISDB3:Environments 和 Environment Variables
Environment 是ETL执行时使用的Parameters的集合,可以为一个Project引用不同的Environment variables,从而改变ETL执行的属性. 查看Environme ...
- A Simple OpenGL Shader Example
A Simple OpenGL Shader Example eryar@163.com Abstract. OpenGL Shading Language, the high-level progr ...
- 自制编程语言crowbar(v0.1)构建解析器时分配内存
crowbar中第一次申请内存是在生成解析器的时候: /* interface.c */CRB_Interpreter *CRB_create_interpreter(void) { MEM_Stor ...
- Windows系统盘占用空间分析
磁盘分析 本机的系统盘是C盘,操作系统是Windows 7 专业版,通过磁盘属性可以看到C盘的已用空间是69.4G. 而我们运行自己编写的脚本(脚本程序参考附录,统计原理:计算目录下各个文件的大小,然 ...
- php语句
判断变量的方法: 例: $a=""; var_dump(empty($a)); 输出的结果为true 若$a=10; var_dump(empty($a)); 输出falst 若没 ...
- Boot from Volume - 每天5分钟玩转 OpenStack(61)
Volume 除了可以用作 instance 的数据盘,也可以作为启动盘(Bootable Volume),那么如何使 volume 成为 bootable 呢? 现在我们打开 instance 的 ...
- eclipse导入项目Archive for required library cannot be read or is not a valid ZIP file
原因 :部分文件毁坏. 解决办法:1. 在eclipse中运行maven clean install 2. 报错,找到报错的文件物理删除,然后重新运行maven clean install 3. 循 ...
- Masonry 当需要把某个控件进行隐藏的时候有警告的解决方案
//查看全文 [self.moreBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo (self.conten ...
- LeetCode - 415. Add Strings
Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2. ...
- WebGIS中一种根据网格索引判断点面关系的方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 判断点面关系的算法有很多,在我之前的博文中有一篇专门对其进行 ...