JAVA 多线程(2)
一、首先 Thread 是实现了Runable 接口的类
理论上Thread 实例与直接实现runable接口的实例运行起来没有什么不同,但是由于JAVA 是单继承,所以如果想再一个类中实现2个不同的thread只有通过实现runable接口。
再来看Thread中start 和 run 的不同,start是启动线程或者说在准备好的thread线程下告诉JVM 准备就绪,可以执行这个线程了,是异步的,也就是说,在启动线程的宿主类中的代码,
并不是按照顺序来执行的。
run方法是立即执行,则不再依附在创建的线程中,而是在主线程中的执行,例如:
public static void main(String[] args){
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
t.setName("我是Thread子线程");
t.start();
t.run();
System.out.println(Thread.currentThread().getName()+": 我在main下");
}
输出结果:

首先线程 给线程t起了一个名字叫 “我是Thread子线程”,代码中是先 start 然后 run ,最后在主线程main中打印(main 并不是方法名main(),main代表的是主线程)
控制台输出接口可以看出,首先代码的顺序跟真正的执行顺序不一致,然后run方法直接打印了主线程的名字 main,因为run方法会在当前执行线程下直接执行,
然后因为给t线程重命名了线程名,所有在start方法调用时,当t线程准备就绪后通知JVM 它已经准备好了,可以调用cpu资源了,当它抢到后才开始执行run方法中的事件。
二、关于守护线程
守护线程与用户线程的概念,可以去网上搜一下,这里我只是稍微说一下个人理解。
可以这样理解在一个进程中有多个线程同时存在,其中分为守护线程与用户线程,理论上所有我们自己执行的事件都属于用户线程,守护线程相当于助理或者说保姆,
比方说,总经理(用户线程)有一个助理(守护线程),如果总经理的工作结束了,那么助理的工作也相当于结束了(例子不是很恰当,理解就好)。
守护线程最典型的就是GC垃圾回收。
当然我们也可以把用户线程变为守护线程
t.setDaemon(true);
他回依附于用户线程,当非守护线程都结束工作或停止后,它业就停止了。
三、停止线程
停止线程有stop、suspend、interrupt,前面2个方法已经废弃了,有兴趣的可以去网上搜下。
interrupt 并不是真正意义上的停止,而是加上一个停止标记。
判断线程是否停止有2个方法
interrupted 和 isInterrupted。
前者是静态方法。
区别:
interrupted 方法会修改停止标记,比如连续调用2次的话,会把true改回false(true 停止了,false激活了)
isInterrupted不会,它只是获得这个是否停止标记。
实际停止正在运行的线程可以通过异常法,例如:
throw new InterruptedException()
然后catch捕捉,处理后续事件。
sleep 沉睡:
在沉睡中停止线程有可能会出现2中情况,在于调用sleep函数的位置,如果是在主线程中操作,有可能start准备好后,在run方法为执行的情况下就终止了线程。
getId:获取线程的id
四、优先级
关于线程优先级,其分为10个等级,如果在调用setPriority 设置优先级的时候,不再这个范围内,会抛出异常。
另外设置优先级,针对jvm 并不一定会按照设置的优先级去执行,只是说优先级高的线程,有可能会比其他优先级较低的线程多一些可能性。
另外优先级具有继承特性,A线程被B线程继承,如果设置A线程的优先级为8,那么B线程的优先级也会更改为8。
五、放弃CPU资源
yield 方法是放弃当前的CPU资源,然后回到争资源的行列。
比如做公车让座,假设只有1个座位,现在是年轻人作者(线程A),上来一个老年人(线程C),年轻人起身让座给老年人,这是还有人D,人E...等人都是站着的,
假设除了老人到站了,起身下车,那么这个座位又空了,这时候就看谁能抢到这个座位了(cpu资源),有可能还是让座的那个年轻人(线程A),也可能是线程D、E。。。。
所有说,yield方法是暂时放弃了资源,但是又可能刚放弃又重启获得了这个资源都是有可能的。
JAVA 多线程(2)的更多相关文章
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- Java多线程 2 线程的生命周期和状态控制
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...
- java 多线程 1 线程 进程
Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报 分类: javaSE综合知识点(14) 版权声明:本文为博主原创文章,未经博 ...
- 一起阅读《Java多线程编程核心技术》
目录 第一章 Java多线程技能 (待续...)
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- java从基础知识(十)java多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
随机推荐
- Python爬虫2-检测编码(使用chardet)
GitHub代码练习地址:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac02_chardet.py 网页编码问题解决 c ...
- 微信小程序快捷键(Mac和windows)
最近因为有点闲暇时间,所以抽空简单了解了小程序,因为小程序是使用微信开发者工具编码,不能使用其它编辑器,比如,Sublime,Hubilder等. 所以就百度了一下小程序快捷键,但总觉得不全,所以就去 ...
- Metasploit Framework(2)Exploit模块、Payload使用
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 Exploit模块分为主动和被动(Active.Pas ...
- Kali学习笔记8:四层发现
1.基于TCP协议 优点: 1.可路由且结果可靠 2.不太可能会被防火墙过滤 3.甚至可以发现端口 缺点: 速度较慢(三次握手) 利用Scapy发送ACK数据包: 配置数据包: 发送数据包: 看一下收 ...
- python爬取猫眼电影top100
最近想研究下python爬虫,于是就找了些练习项目试试手,熟悉一下,猫眼电影可能就是那种最简单的了. 1 看下猫眼电影的top100页面 分了10页,url为:https://maoyan.com/b ...
- python之asyncio
asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asnycio是用来编写并发代码的库,python3.5以后使用async/await语法. asyncio 被用作 ...
- 机器学习入门14 - 神经网络简介 (Introduction to Neural Networks)
原文链接:https://developers.google.com/machine-learning/crash-course/introduction-to-neural-networks/ 神经 ...
- Testing - 自动化测试的几个基础概念
自动化测试框架与模型 一个自动化测试框架就是一个集成体系,在这一体系中包含测试功能的函数库.测试数据源.测试对象识别标准,以及种可重用的模块. 自动化测试框架在发展的过程中经历了几个阶段,模块驱动测试 ...
- PHP之ThinkPHP框架(会话)
网页会话即是实现页面跳转及数据传递,在web开发中,Cookie和Session的使用是极其重要的,GET和POST是最常使用的页面间数据传递的方法,相对于PHP脚本基础,在ThinkPHP中对网页会 ...
- 安全测试之sql注入
不管是web界面还是app,都会涉及表单输入和提交,如果程序员没有对提交的字符进行过滤或者特殊处理,很容易会产生问题,这里讲的的sql注入就是其中一种方式,在表单中输入sql语句达到进入系统的目的. ...