0

点赞

0

回复

0

浏览

Java线程的生命周期

1 JAVA线程的生命周期 1.1 NEW 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。 注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常。 1.2 RUNNABLE 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列。因为cpu的调度不一定是按照先进先出的顺序来调度的),等待系统为其分配CPU。 等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。 提示:如果希望子线程调用start()方法后立即执行,可以使用Thread.sleep()方式使主线程睡眠一伙儿,转去执行子线程。 1.3 RUNNING 处于运行状态的线程最为复杂, 它可以变为阻塞状态、就绪状态和死亡状态 。 1. 处于就绪状态的线程,如果获得了cpu的调度,就会从就绪状态变为运行状态,执行run()方法中的任务。 2. 如果该线程失去了cpu资源,就会又从运行状态变为就绪状态。重新等待系统分配资源。也可以对在运行状态的线程调用yield()方法,它就会让出cpu资源,再次变为就绪状态。 3. 当发生如下情况是,线程会从运行状态变为阻塞状态: 1. 线程调用sleep方法主动放弃所占用的系统资源 2. 线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞 3. 线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有 4. 线程在等待某个通知(notify) 5. 程序调用了线程的suspend方法将线程挂起。不过该方法容易导致死锁,所以程序应该尽量避免使用该方法。 4. 当线程的run()方法执行完,或者被强制性地终止,例如出现异常,或者调用了stop()、desyory()方法等等,就会从运行状态转变为死亡状态 1.4 BLOCKED 处于运行状态的线程在某些情况下将让出CPU并暂时停止自己的运行,进入阻塞状态如 1. 执行了sleep(睡眠)方法, 2. 或等待I/O设备等资源。 当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。 1.5 DEAD 当线程的run()方法执行完,或者被强制性地终止,就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。 2 JAVA线程控制 // 开始线程 ...

线程生命周期java

0

点赞

1

回复

1

浏览

Java线程同步与锁

线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏,线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他同步方法。 1 锁的原理 Java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。当程序运行到synchronized同步方法或代码块时才该对象锁才起作用。 一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。 释放锁是指持锁线程退出了synchronized同步方法或代码块。 2 一些要点 1. 只能同步方法或者代码块,而不能同步变量和类 2. 线程可以获得多个锁。比如,在一个对象的同步方法里面调用另外一个对象的同步方法,则获取了两个对象的同步锁 3. 每个对象只有一个锁;当提到同步时,应该清楚在什么上同步?也就是说,在哪个对象上同步 4. 当多个线程等待一个对象锁时,没有获取到锁的线程将发生阻塞 2.1 非静态方法加锁 给非静态方法加锁,同步对象是this,即类的当前对象。如果一个线程在对象上获得一个锁,就没有任何其他线程可以进入(该对象的)类中的 任何 一个同步方法。如果两个线程要执行一个类中的synchronized方法,并且两个线程使用相同的实例来调用方法,那么一次只能有一个线程能够执行方法,另一个需要等待,直到锁被释放。但如果是两个不同的对象,那么就无关紧要,因为是获取不同的锁 public class Foo {...

同步java线程

0

点赞

0

回复

0

浏览

log4j使用总结

实际项目开发过程中,日志是一个重要且必须的内容,通过日志我们可以监测代码部署之后的运行状况,包括查看出错原因、收集我们想要的信息等等。 使用Log4J,程序员可以控制日志信息输送的目的地,包括控制台,文件,GUI组件和NT事件记录器,也可以控制每一条日志的输出格式,或通过定义每一条日志信息的级别,更加细致地控制日志的生成过程。 1 LOG4J的组成 Log4j由三个重要的组成构成:日志记录器(Loggers),输出端(Appenders)和日志格式化器(Layout)。 1. Logger:控制要启用或禁用哪些日志记录语句,并对日志信息进行级别限制 2. Appenders指定了日志将打印到控制台还是文件中 3. Layout则控制日志信息的显示格式。 一个logger可以用多个appender,也就是说日志信息可以同时输出到多个设备上,每个appender对应一种layout。 所以,记录器用来整合日志信息,一个日志信息调整好以后,交给记录器的所有Appender,每一个Appender根据自己的格式输出日志信息。 2 LOG4J的使用 这里只介绍maven引入log4j的依赖 ...

log4jjava日志

0

点赞

0

回复

0

浏览

Java线程及锁机制

1 THREAD类 Thread类实现了Runnable接口,start方法根据Thread对象中的数据生成一个新的控制线程,然后返回。现在虚拟机调用新线程中的run方法,从而激活这个线程。 我们只能为每个线程调用一次start方法,否则再次调用会爆出IllegalThreadStateException异常。 当线程的run方法返回,线程就已经退出了。 Thread.run的标准实现并未做任何事情,要想让线程执行某些工作,就必须 1. 扩展Thread类以提供一个新的run方法,或者 2. 创建一个Runnable对象并把它传递给线程的构造器 我们首先讨论如何通过扩展Thread类来创建新的线程类型 / ...

线程java

0

点赞

0

回复

0

浏览

反射技术用于工厂模式

1 反射技术 反射技术大量用于Java设计模式和框架技术,最常见的设计模式就是工厂模式(Factory)和单例模式(Singleton)。 用接口来沟通不同程序的开发进度,不必等上游程序写好代码之后,再注入后面流程的程序员。且在实现上, 可以用配置文件灵活变更,而不用重编译整个项目 。 interface InterfaceTest {...

java反射设计模式

0

点赞

0

回复

0

浏览

Java反射技术

1 概念 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2 功能 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态代理。 3 相关API 3.1 通过对象获取完成的包名和类名 public class TestReflect {...

java反射

0

点赞

0

回复

0

浏览

JUnit4测试用例执行顺序设置

1 介绍 在写JUnit测试用例时,有时候需要按照定义顺序执行我们的单元测试方法,比如如在测试数据库相关的用例时候要按照测试插入、查询、删除的顺序测试。如果不按照这个顺序测试可能会出现问题,比如删除方法在前面执行,后面的方法就都不能通过测试,因为数据已经被清空了。而JUnit测试时默认的顺序是随机的。所以这时就需要有办法要求JUnit在执行测试方法时按照我们指定的顺序来执行。 JUnit是通过 @FixMethodOrder 注解(annotation)来控制测试方法的执行顺序的。 @FixMethodOrder 注解的参数是 org.junit.runners.MethodSorters 对象,在枚举类 org.junit.runners.MethodSorters 中定义了如下三种顺序类型: MethodSorters.JVM Leaves the test methods in the order returned by the JVM. Note that the order from the JVM may vary from run to run (按照JVM得到的方法顺序,也就是代码中定义的方法顺序) MethodSorters.DEFAULT Sorts the test methods in a deterministic, but not predictable, order() (以确定但不可预期的顺序执行) MethodSorters.NAME_ASCENDING Sorts the test methods by the method name, in lexicographic order, with Method.toString() used as a tiebreaker (按方法名字母顺序执行) 2 测试 package test;...

测试用例javajunit

0

点赞

0

回复

17

浏览

elasticsearch Java API的使用以及坑的注意

1 创建CLIENT Settings settings = Settings.builder().put("cluster.name", "UBA").put("client.transport.sniff", true) .build();TransportClient client = new PreBuiltTransportClient(settings)...

javaelasticsearch

0

点赞

2

回复

189

浏览

Java中的final关键字在变量.方法.类的使用特点

Java中的final关键字非常重要,含义存在着细微的区别,通常指“这是无法改变的”,不想改变可能出于两种理由:设计和效率。注意是可能,下面说一下我学习使用到final的三种情况:final变量.final方法和fianl类。 1. FINAL变量 //先举例2个例子:private static final String TIANMAYING_HE = "haha";//变量是基本数据类型的,...

java基础java

0

点赞

0

回复

225

浏览

如何将默认Eclipse项目转为Maven项目

将已有的ECLIPSE项目转化为MAVEN项目 我们之前在Eclipse IDE完成的Java命令行项目、Java Web项目也使用了构建工具—— Ant http://ant.apache.org/ ,它帮助我们编译、运行Java源代码(无需我们自己调用 javac , java 等命令来进行重复、繁琐的构建任务)。以Java项目为例,它的目录结构一般是这样的: ....

eclipsemavenjava

0

点赞

0

回复

148

浏览

使用Servlet和JSP实现用户注册功能

用户注册表单处理 结合Servlet和JSP来实现一个用户注册功能,此时你应该已经了解 Web表单处理 https://course.tianmaying.com/servlet and jsp+form 的关键概念。 我们将用户注册的信息存放在内存中(即Java程序中的某个变量)。首先看看用户注册表单需要填写的信息:   ...

servletjavaJSP

0

点赞

0

回复

171

浏览

【SEO】批量查询百度收录和排名

背景: 1.作为SEO,每天都有一批数据需要记录,抓取方面,收录方面,流量方面等。 2.在收录方面,收录率是非常有意义的一个指标,可以直接反映整站或者某频道的收录情况。 3.最近学习了 天码营的云音乐爬虫课程 https://course.tianmaying.com/music 163 crawler 正好用查询百度收录和排名爬虫来复习下爬虫课程。 思路: 1. 用搜索关键词构建百度搜索URL。 2. 获取百度搜索结果页内容。 3. 提取百度搜索结果(排名,标题,url)。 4. 收录判定 上核心代码: public class PCBaiduHtmlParser {...

java爬虫seo

3

点赞

0

回复

343

浏览

为什么需要Java接口?

很多初学Java的同学都不知Java接口 interface 到底用什么作用,为什么需要这样一个概念。在知乎上也回答过类似的问题。这里再简单记录一下,供各位同学参考。注意,接口相关的设计思想是面向对象设计的一个精华所在,这里只是一个面向初学者的简单阐述。 1. 接口是一种规范 下面这张图是我们生活中遇到的接口:电源插座接口。 没错!它就是一种规范,中国2010年制定的插座标准。 2. 为什么需要规范呢? 因为有了接口规范: 任何电器只有有符合规范的插头,就可以获得电力 任何厂家(西门子插座,TCL插座,公牛插座...)按照规范进行制作,就能进行供电 每个厂家插座的生产技术、工艺都不一样,因为接口的implementation可以不一样,但是并不影响电器的正常工作。插座的内部实现对于电器来说是完全屏蔽的。 对于软件开发是类似的: 按照接口规范进行方法调用,就能获得所期望的功能 按照接口规范实现接口的的方法,就能提供所期望的功能 接下来是重点了: 软件开发大多是一个协作性的工作 :电器和插座分别是不同人完成的,有了接口大家就能分头开干,都按照接口来办事,各自做完就能轻松地整合到一起。各部分的测试也更加方便。 软件需要不断演化 :今天你用了公牛的插座,过了一年你可能换个西门子的插座,要做没有这套国家接口标准,各自为政,那估计你是换不了插座了。你想想,咱们每次去美国出差,都得带个转接头,否则就跪了,多不方便啊,因为接口规范不同啊!(这些个转接头你是不是闻道一种浓浓的Adapter模式的味道)。 3. 什么时候需要通过接口建立规范 为了抽象系统的某种公共行为,或者封装变化性,进行系统设计的时候你需要抽取出接口,这样将来你的系统将更加灵活。 直接写实现的方式在确定性的场景下当然也可以,不涉及到分工协作、变化性、测试方便等因素时,当然用不着接口了。比如一般情况下你犯不着为一个Pojo的getter和setter也弄个接口和实现分离。 所以面向对象的大神们孜孜不倦地教导我们说: 接口和实现分离,面向接口编程 。 ...

java

1

点赞

0

回复

594

浏览

Java贪吃蛇应用的设计与实现

今天来实现一个简单的贪吃蛇应用,效果如下: 这里把大概实现过程跟大家讲解一下,完整的教程比较长,大家参考 Java贪吃蛇 https://course.tianmaying.com/java snake 在网上能找到不少贪吃蛇的代码,但是往往写得比较乱,甚至有所有代码都包含在一个类中的情况,对于初学者而言即使能Copy后跑起来,也不一定能够真正理解代码的逻辑。 实际上实现贪吃蛇的代码并不复杂,如果尝试去给出优雅地实现,比如写出具有清晰的类结构,有助于真正提高大家程序设计的基本功。 此外,应该让代码具有良好的扩展性,将来你希望更新你的贪吃蛇应用时,比如: 让贪吃蛇显示出不同的样子 增加或者修改积分规则 应该要做到修改尽量少的代码。实际的应用都是不断演化的,良好的设计能够让应用更易于维护。 所以贪吃蛇应用非常适合入门Java编程的同学,可以了解用面向对象的方式来编程解决问题,学习如何设计类,如何选择数据结构以及Java Swing的基础知识。 开始设计 Java是一门面向对象语言,一个Java程序就是一系列对象(Object)的集合,对象通过方法调用来彼此协作完成特定的功能。面向对象是一种非常符合人类思维的编程方法,因为现实世界就是由对象和对象之间的交互来构成的,所以我们其实很容易将现实世界映射到软件开发中。其实我们可以把Java语言当成是一门普通的语言,学习英语是为了与世界交流,而学习Java就是与计算机交流。我们需要把自己的思维,通过Java语言表达出来,让计算机理解。 那现在我们怎么用Java,用面向对象的思维,来表达出贪吃蛇这个游戏呢? 贪吃蛇游戏的规则无需多言,我们马上能想到两个对象,一条蛇和一个棋盘,我们可以定义两个类: public class Snake {...

java

9

点赞

2

回复

4417

浏览

用Java实现网易云音乐爬虫

起因 前两天在知乎上看到一个帖子《 网易云音乐有哪些评论过万的歌曲? https://www.zhihu.com/question/31677442 》,一时技痒,用Java实现了一个简单的爬虫,这里简单记录一下。 最终的结果开放出来了,大家可以随意访问, 请戳这里 网易云音乐爬虫结果 http://grri94kmi4.app.tianmaying.com/songs 。 爬虫简介 网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,一个通用的网络爬虫大致包含以下几个步骤: 网络爬虫的大致流程如上图所示,无论你是做什么样的爬虫应用,整体流程都是大同小异。现在,我们就根据网易云音乐来定制一个专门爬取音乐评论数量的特定网络爬虫。 前期准备 网页类型分析 首先,我们需要对 网易云音乐 http://music.163.com/ 整个网站有个大致的了解,进入 网易云音乐首页 http://music.163.com/ ,浏览后发现其大概有这么几种类型的URL: 推荐页面 排行榜列表以及排行榜页面 歌单列表以及歌单页面 主播电台列表以及主播电台页面 歌手列表以及歌手页面 专辑列表(新碟上架)以及专辑页面 歌曲页面 我们最终需要爬取的数据在歌曲页面中,该页面里包含了歌曲的名称以及歌曲的评论数量。 另外,我们还需要尽可能多的获取歌曲页面,这些信息我们可以从前面6种类型的页面拿到。其中,歌单列表以及歌单页面结构最简单,歌单列表直接分页就可以拿到。因此,我们选择歌单页面作为我们的初始页面,然后歌单列表 歌单 歌曲一路爬下去即可。 设计数据模型 通过上述分析,我们可以知道我们要做两件事情,一是爬取页面歌单列表 歌单 歌曲,二是将最终的结果存储起来。因此,我们只需要两个对象,一个用来存储页面相关的信息,url、页面类型、是否被爬过(html和title作为临时数据存储),另外一个用来存储歌曲相关信息,url、歌曲名,评论数。因此,model类如下: public class WebPage {...

爬虫spring-mvcjava

新建主题 记录代码

学员动态

  • k**e在课程作业中回复了老师:com.tianma...
  • w**7在课程中提出了问题:package co...
  • 2**b向课程作业中提交了代码
  • y**_向课程作业中提交了代码
  • f**o向课程作业中提交了代码
  • k**e添加了笔记:使用final修饰方...
  • 天**君评论了y**n在课程中的作业:调用postRepo...
  • e**1向课程作业中提交了代码
  • 天**君回复了v**l在课程中的问题:Java基础课程不需...
  • k**e向课程作业中提交了代码
  • w**3评论了2**b在课程中的作业:double c =...
  • f**o在课程作业中回复了老师:自己运行程序测试了,...
  • S**S回复了2**b在课程中的问题:new 一个 值为 ...
  • 1**2评论了:...
  • y**n向课程作业中提交了代码
  • 2**b在课程作业中回复了老师:我写的是Math.s...
  • 天**君评论了f**o在课程中的作业:也可以用天码营的前端...
  • S**S评论了f**o在课程中的作业:你只需要 满足 作业...
  • h**i向课程作业中提交了代码
  • y**n在课程中提出了问题:您看看我的代码吧,很...
  • S**S评论了y**n在课程中的作业:for循环输出所有 ...
  • s**k向课程作业中提交了代码
  • k**e添加了笔记:方法的返回值和参数构...
  • c**8向课程作业中提交了代码
  • w**7在课程作业中回复了老师:为啥使用String...
  • k**e向课程作业中提交了代码
  • S**S回复了喵**咪在课程中的问题:这里是个简单的事例。...
  • k**e添加了笔记:反射是一种动态获取信...
  • w**3回复了w**7在课程中的问题:length是返回字...
  • 天**君回复了c**8在课程中的问题:directionC...
  • k**e向课程作业中提交了代码
  • f**o在课程作业中回复了老师:空格键暂停是不是要通...
  • k**e添加了笔记:StringBuff...
  • c**8在课程中提出了问题:我点Java Web...
  • 2**b在课程作业中回复了老师:老师,系统出错了吗。...
  • 喵**咪在课程中提出了问题:这个括号里面的内容是...
  • s**8添加了笔记:定义成员变量时,可以...
  • y**n在课程中提出了问题:请您再看一下我的显示...
  • S**S回复了c**8在课程中的问题:Maven是包管理工...
  • 喵**咪添加了笔记
  • k**e向课程作业中提交了代码
  • 天**君回复了2**b在课程中的问题:欢迎来到天码营学习,...
  • S**S评论了f**o在课程中的作业:if(grid.ne...
  • s**k向课程作业中提交了代码
  • S**S评论了y**n在课程中的作业:System.out...
  • 2**b在课程作业中回复了老师:老师,请问一下为什么...
  • S**S评论了f**o在课程中的作业:你做好之后 把 截图...
  • c**8在课程中提出了问题:实战任务的参考代码怎...
  • S**r添加了笔记:先声明对象名称,空格...
  • S**S评论了w**7在课程中的作业:对象需要实例化 才能...
  • z**g添加了笔记:格式化字...
  • k**e向课程作业中提交了代码
  • k**e向课程作业中提交了代码
  • 天**君回复了1**8在课程中的问题:欢迎来到天码营学习,...
  • 2**b向课程作业中提交了代码
  • T**r向课程作业中提交了代码
  • 天**君评论了2**b在课程中的作业:我建议你再看看教程,...
  • f**o在课程作业中回复了老师:如何开启下一节课的作...
  • S**S回复了c**8在课程中的问题:?什么问题? 买了J...
  • 2**b在课程作业中回复了老师:老师,还是报错。。您...
  • s**u向课程作业中提交了代码
  • 天**君回复了v**l在课程中的问题:克隆什么仓库? gi...
  • 1**7添加了笔记:接口的继承使用ext...
  • S**S评论了k**e在课程中的作业:不要修改返回值类型 ...
  • S**S回复了y**n在课程中的问题:看下代码答疑。 您看...
  • 天**君评论了y**n在课程中的作业:LocalDateT...
  • k**e向课程作业中提交了代码
  • S**S回复了v**l在课程中的问题:基础课程 暂时 不用...
  • k**e向课程作业中提交了代码
  • 喵**咪添加了笔记:单行注释:在注释内容...
  • 2**b在课程中提出了问题:Integer in...
  • k**e向课程作业中提交了代码
  • S**r添加了笔记:byte、short...
  • 2**b向课程作业中提交了代码
  • v**l在课程中提出了问题:好哒 应该是到时候会...
  • k**e在课程作业中回复了老师:这个方法报...
  • 2**b向课程作业中提交了代码
  • f**o向课程作业中提交了代码
  • 天**君回复了t**1在课程中的问题:欢迎来到天码营学习,...
  • w**7在课程中提出了问题:在程序的20行,用c...
  • v**l在课程中提出了问题:点击右侧的按钮可以拷...
  • k**e添加了笔记:被final修饰的方...
  • 2**b在课程作业中回复了老师:老师,我第6条代码不...
  • f**o在课程作业中回复了老师:空格键暂停是不是要通...
  • S**r添加了笔记:用包package来...
  • c**3在课程中提出了问题:老师,不修改给出的那...
  • k**e向课程作业中提交了代码
  • w**3评论了k**e在课程中的作业:StringBuil...
  • v**l在课程中提出了问题:心疼认真看《如何开始...
  • t**1向课程作业中提交了代码
  • h**i向课程作业中提交了代码
  • 2**b在课程作业中回复了老师:老师你好,我想请问一...
  • k**e在课程中提出了问题:package co...
  • s**k向课程作业中提交了代码
  • w**3评论了2**b在课程中的作业:double a =...
  • w**3评论了2**b在课程中的作业:Math.sqrt(...
  • S**S评论了f**o在课程中的作业:这里不用做判断...
  • s**u向课程作业中提交了代码
  • S**S回复了c**3在课程中的问题:多看几遍教程中的强制...
  • k**e向课程作业中提交了代码
反馈意见