java 线程的理解_Java多线程理解

首先说一下进程和线程的区别

进程:是计算机运用程序实例,拥有独立的内存空间和数据(猜测内存堆应该是作用的进程上),一个进程包含多个子线程,不同进程相互独立;

线程:cpu执行的基本单位,拥有独立的寄存器和栈,同一进程下的线程共享地址&内存空间;线程栈存放方法的栈帧,每次方法执行都会新建栈帧压到栈顶,当线程中某个请求大小超过限制则提示StackOverflowError,当需要存储一个新的栈帧且栈内存不足则抛出OutOfMemoryError;栈帧包含局部变量、返回值、方法引用的常量池(栈帧只能存储对象的引用)

cpu可以按时间切片执行,单核cpu同一个时刻只支持一个线程执行任务,多线程并发事实上就是多个线程排队申请调用cpu,cpu处理任务速度非常快,所以看上去多个线程任务说并发处理。

线程各个状态

1、新建状态(New):新创建了一个线程对象

2、就绪状态(Runnable):创建完线程并调用start()方法后等待获取cpu使用权,获取线程丢失cpu使用权后等待下一个cpu使用权

3、运行状态(Running):处于就绪状态的线程获取到cpu的使用权,执行程序代码

4、堵塞状态(Blocked):当某线程暂时放弃cpu使用权,该线程就处于堵塞状态,且处于堵塞状态线程不再申请调度cpu

a、等待堵塞:当对象调用wait方法,当前线程进入等待池,直到等待时间到或者调用该对象的notify方法

b、同步堵塞:当线程访问带同步锁的成员,且此时该同步锁被其它线程占用,该线程进入锁池,直到其它线程释放同步锁且当前线程获取到该同步锁

c、其它堵塞:调用当前线程sleep方法或者调用其它线程对象的join方法,直到sleep时间到期或者其它线程任务执行完

5、死亡状态(Dead):线程任务执行完毕或者线程抛出异常

如上状态流程图大体如下

c7438a81e0a31d4967f843c261d1da4f.png

虽然sleep和wait都能使线程进入等待状态,但两个方法差别如下:

1、sleep属于Thread类对象方法,wait属于Object类对象方法

2、调用线程对象sleep方法使得该线程处于等待状态,在时间到期之前不会申请调度cpu,如果该线程持有对象锁,则该线程不会释放对象锁;调用对象wait方法,持有该对象的线程进入等待池,且该线程会放弃对象锁

3、wait,notify等必须结合Synchronized来使用,sleep不需要

写了一个同步锁例子,三个子线程依次打印

public static void main(String[] args) {

// TODO Auto-generated method stub

Thread thread1=new ChildThread("thread1");

Thread thread2=new ChildThread("thread2");

Thread thread3=new ChildThread("thread3");

thread1.start();

thread2.start();

thread3.start();

}

public class ChildThread extends Thread{

private static List dataSource=new ArrayList<>();

private static Object lockObj=new Object();

private static int MaxLength=5;

private int currentNumber=1;

private String name;

public ChildThread(String name) {

this.name=name;

dataSource.add(this);

}

@Override

public void run() {

super.run();

while (currentNumber<=MaxLength) {

synchronized (lockObj) {

boolean isbellow = isBellow();

if(isbellow){

Log.i(" " ,String.format("%s=%s",name,currentNumber));

currentNumber++;

lockObj.notifyAll();

}

else{

try {

lockObj.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

private boolean isBellow(){

boolean isBellow=true;

for (ChildThread childThread:dataSource) {

if(currentNumber>childThread.currentNumber){

isBellow=false;

break;

}

}

return isBellow;

}

}

结果如下

06-01 23:10:28.153 19108-19148/haozuo.com.myapplication I/: thread3=1

06-01 23:10:28.156 19108-19147/haozuo.com.myapplication I/: thread2=1

06-01 23:10:28.157 19108-19146/haozuo.com.myapplication I/: thread1=1

06-01 23:10:28.157 19108-19146/haozuo.com.myapplication I/: thread1=2

06-01 23:10:28.159 19108-19148/haozuo.com.myapplication I/: thread3=2

06-01 23:10:28.161 19108-19147/haozuo.com.myapplication I/: thread2=2

06-01 23:10:28.161 19108-19147/haozuo.com.myapplication I/: thread2=3

06-01 23:10:28.163 19108-19148/haozuo.com.myapplication I/: thread3=3

06-01 23:10:28.163 19108-19146/haozuo.com.myapplication I/: thread1=3

06-01 23:10:28.163 19108-19146/haozuo.com.myapplication I/: thread1=4

06-01 23:10:28.163 19108-19148/haozuo.com.myapplication I/: thread3=4

06-01 23:10:28.164 19108-19147/haozuo.com.myapplication I/: thread2=4

06-01 23:10:28.164 19108-19147/haozuo.com.myapplication I/: thread2=5

06-01 23:10:28.165 19108-19148/haozuo.com.myapplication I/: thread3=5

06-01 23:10:28.167 19108-19146/haozuo.com.myapplication I/: thread1=5

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些 ...

关于java多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题, 另外关于java多线程的知识也是非常的多,本文中先介绍和说明一 ...

java多线程理解及实现

其实多线程也很好理解,就好比我们坐高铁.飞机过安检一样,过安检的时候一个入口只有一个安检口,而多线程就是为安检开启了多个安检口,话不多说贴代码 线程实现的三种方式: 一.继承Thread类创建线程类 ...

java多线程理解2

1. 什么时候必须同步?什么叫同步?如何同步? 要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见 ...

Java多线程-----理解CountDownLatch

CountDownLatch简介  CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHa ...

Java多线程理解:线程安全的集合对象

1.概念介绍 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就 ...

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...

java多线程的理解

java多线程的理解   线程的5种状态:新建,就绪,运行,阻塞,死亡. Thread.sleep:线程  运行状态 转为  阻塞状态,(其它线程启动运行) Thread.yield:   线程 运行 ...

关于java多线程中异常捕获的理解

在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

随机推荐

Coursera台大机器学习课程笔记7 -- Noise and Error

本章重点:  简单的论证了即使有Noise,机器依然可以学习,VC Dimension对泛化依然起作用:介绍了一些评价Model效果的Error Measurement方法. 一论证即使有Noisy, ...

java开发模式学习

1.瀑布模式 这种模式适合小项目,一层层进行编码,没有规模的设计, 2.原型模式 先做模板给客户在做实体 3.面向对象模式 用面向对象的思想进行开发 4.螺旋模式 从内到外一层层开,

NABCD模型需求分析

仓库管理系统的NABCD模型 N-Need仓库管理是与我们日常生活息息相关的问题,随着改革开放的不断深入,经济飞速的发展,企业要想生存.发展,要想在激烈的市场竞争中立于不败之地,没有现代化的管理是万万 ...

Java&lowbar;Spring MVC&lowbar;Servlet

Spring MVC 例子 http://www.cnblogs.com/liukemng/p/3724379.html 详解: http://jinnianshilongnian.iteye.com ...

一:详解 HTTP 协议

本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP 通信传输流 利用 TCP/IP 协议族进行网络通信 ...

个人作业2:QQ音乐APP案例分析

APP案例分析 QQ音乐 选择理由:毕竟作为QQ音乐九年的资深老用户以及音乐爱好者 第一部分 调研 1.第一次上手的体验    我算是很早期的QQ音乐的用户,用QQ音乐七八年,除了体验各方面还不错之外 ...

JavaScript新手入门 贪吃蛇

从小就在玩贪吃蛇,但是知道今天自己做了一遍才知道原理的具体的实现步骤. 刚进入界面时显示开始游戏(不重要,本人比较喜欢吹毛求疵) 中间黑色部分为游戏的主要展示部分 主要步骤及源码: body中代码,红 ...

Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的一文,我们已经知道如何通过Hystrix来保护自己的服务不被外 ...

MVP&comma; MVC&comma; MVVM&comma; 傻傻分不清楚~

1 简介 英文原文:MVC vs. MVP vs. MVVM 三者的目的都是分离关注,使得UI更容易变换(从Winform变为Webform),使得UI更容易进行单元测试. 2 MVC/MVP 2.1 ...

Could not locate executable null&bsol;bin&bsol;winutils&period;exe in the Hadoop binaries&period;

很明显应该是HADOOP_HOME的问题.如果HADOOP_HOME为空,必然fullExeName为null\bin\winutils.exe.解决方法很简单,配置环境变量,不想重启电脑可以在程序里 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值