java 停止for_java线程for循环没有循环完成就停止了,这是为什么?
你 根据 多线程 和 锁 的 执行 过程 分析 代码。理论要先学好。
1、多线程
各线程自己同时运行(cpu太快,你可以理解为同时),各不相干。但遇到多线程同时修改同一变量,会发生并发问题。为什么,深层是计算机内存原理,JMM原理。为了解决这问题,所以用锁。
2、锁
单线程是安全的。代码加锁了以后,线程想要执行代码,就要获取锁,代码执行完,锁释放。
锁分很多种。可以根据用途特性分为几个类型。
乐观锁 和 悲观锁。
共享锁 和 排他锁。(读写锁:读锁,设计为共享锁,同时读,效率高,线程不等待。写锁,只能一个线程操作,代码变为单线程顺序执行。保证变量安全。所以一般都是排他锁。)
公平锁 和 非公平锁。公平:多个线程之间顺序轮流拿锁,每人排队拿锁。每人执行同样的次数,每个线程都能执行,公平,不公平锁:每次有锁释放时,CPU随机分配一个线程拿锁。很简单,那样有可能一个线程等半天拿不到锁情况。这就是跟那个故事一样的道理,就是一个
猴子坐在电脑前,不停的敲键盘,只要时间够长,他可以敲出一部莎士比亚小说集。
可重入锁 和 不可重入锁。大部分都是可重入锁。
sychronized 是 排他锁,悲观锁,不公平锁,可重入锁。
你的2个问题。
1、使用Vector,你2子线程都用list锁,主线程读list,就是三个线程都用的list这个对象的对象锁,就是同一个锁。
子线程代码你自己看,循环是在同步锁里面的,抢到锁以后,循环时不需要抢锁,因为是可重入锁,执行完,线程就结束了,线程结束了,锁也释放了,只要抢1次锁就结束了。
main主线程,每次循环调用size()方法抢锁,执行完,释放锁,然后get(i)又抢锁,然后又释放锁,循环1次抢2次锁。所以抢N次锁。
2、为什么2子线程用LOCK锁了,主线程Vector list也打印不全。这很简单啊。此时主线程用list锁,和子线程的大锁LOCK不是同一个锁,但是和子线程里的add是同一把锁,都是对象锁list。
这样子,2子线程和main主线程要抢锁。但是代码你看。这时候子线程要等1毫秒的。主线程1秒后启动,此时大概有900个数据进list了。主线程也要开始抢锁了,但是2个子线程都在睡眠中。(为啥都在睡眠中,请仔细思考这里),
主线程每次循环抢2次锁,没人和它抢了,他就把900个数据打印完了,主线程结束了。后面子线程继续往list中加完数据才结束。(自己思考)。2张图看你自己的代码。另外,一口吃不成胖子。搞编程的需要时间,因为大部分人没有那么高的智商。
java 停止for_java线程for循环没有循环完成就停止了,这是为什么?相关推荐
- 【Java 语言】Java 多线程 一 ( 线程基础 : 线程启动 | 线程停止 | 线程暂停 | 线程优先级 | 守护线程)
一. 线程启动 线程启动 : -- 1. 继承 Thread 运行线程 : 重写 Thread 类的 run 方法, 然后执行该线程; -- 2. 实现 Runnable 接口, 并运行线程; -- ...
- java 停止一个线程_Java如何停止一个线程
线程正常执行完毕,正常结束. 2.监视某些条件,直到某些条件成立,结束线程. class TestMyThread extends Thread { private volatile boolean ...
- java 一个线程运行_Java并发(基础知识)—— 创建、运行以及停止一个线程
在计算机世界,当人们谈到并发时,它的意思是一系列的任务在计算机中同时执行.如果计算机有多个处理器或者多核处理器,那么这个同时性是真实发生的:如果计算机只有一个核心处理器那么就只是表面现象. 现代所有的 ...
- java线程怎么重启_如何在Java中启动/停止/重启线程?
10 个答案: 答案 0 :(得分:41) 一旦线程停止,您就无法重新启动它.但是,没有什么可以阻止您创建和启动新线程. 选项1:创建一个新线程,而不是尝试重新启动. 选项2:而不是让线程停止,让它等 ...
- 【Java开发规范】禁止在 foreach 循环里进行元素的 remove/add 操作
在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考. foreach循环 Foreach循环(Foreach loop)是计算机编程语言 ...
- java for if嵌套_for循环嵌套if语句怎么循环-for 循环嵌套if语句-for循环语句嵌套使用的实例...
for循环嵌套里怎幺用if语句控制外循环? 修改如下 int Su(int x) { int i,j; for(i=x;i>=2;i--) { for(j=2;j<=i>=i> ...
- Java一个线程能否结束另一个永不停止的线程
在Java中停止一个线程有三种办法 : 1.正常结束执行: 2.发生异常; 3.被其他线程stop(Java官方不建议) 参考:https://docs.oracle.com/javase/8/doc ...
- java for 嵌套_Java中的for循环嵌套
Java嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构.whiledo.while.for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,如最常见的在for循环中嵌套for循环, ...
- java byte 循环左移 循环右移 rotateLeft rotateRight
java byte 循环左移 循环右移 rotateLeft rotateRight 1.概念. 循环左移: eg1:byte in = (byte) 0x01;[0000 0001]则循环左移2位后 ...
最新文章
- java组长一个月工资多少,保准看明白!
- C++11中线程所有权转移分析
- Screenium 3 for Mac - 强大的屏幕录制编辑器
- python编程用户登陆c_python编写登录接口(上)
- NameError: name 'reload' is not defined等python版本问题解决方案
- 嵌入式linux运行编译器,gcc编译器的使用
- webstorm怎样查找历史记录
- Nicescroll用法
- 【胡学长 带你学 Global Mapper 】Global Mapper Pro 23.1 -x64安装教程(附*英*软件包下载)
- np.array()函数
- mongo异常无法启动-处理方法
- 软件测试:给你一个网站,你如何测试
- 【JS Web 前端知识库】6.说一说BFC
- 判断两个圆相切或相交
- 致敬5G时代“她力量”,那些让人怦然“兴”动的女神们
- 微信小程序开发之——用户登录-搭建开发者服务器(2)
- 2022年全球及中国工程软件 (CAD、CAM、 CAE、AECEDA)行业头部企业市场占有率及排名调研报告
- 圆周率近似计算matlab,matlab 圆周率的近似计算 实验报告.doc
- CAD转PDF软件简单便捷的免费
- go ent框架使用
热门文章
- AI商业产品经理:我眼中的AI简史
- Facebook开源计算机视觉目标检测平台Detectron
- android adb wifi
- 轻松理解vuex的运用和常见问题,顺便学会vue企业必备实例
- 还在发愁linux命令记不住吗?神器来了!
- 在${}中为甚么采用@Param及多参数查询@Param
- leetcode 764. Largest Plus Sign | 764. 最大加号标志(Java)
- 【MyBatis】MyBatis对Log4J的支持、MyBatis实现新增、删除、修改、查询
- 【Java正则表达式】正则基本语法、使用方式(分组、替换、分割)、简单爬虫基础
- 【Java版】将汉字转化为gb2312编码