try

谈谈Java的线程池设计

懵懂的女人 提交于 2020-04-02 20:16:53
在实际项目中,如果因为想异步执行暂时性的任务而不断创建线程是很浪费资源的事情(当一个任务执行完后,线程也没用了)。这种情况下,最好是将任务提交给线程池执行。 所谓池,就是将管理某一种资源,对资源进行复用的对象。线程池就是对线程管理的对象。 本文就是介绍线程池内部是如何管理线程,并复用线程的。 相关接口 JDK在内部对线程池提供了大致四层的接口(类)用来提供线程池的行为,分别是顶层接口 Executor (这个接口可以理解为执行器,负责执行任务,),可关闭的执行器 ExecutorService (这个接口开始才具备线程池的概念),提供线程池基本框架的抽象类 AbstractExecutorService ,以及线程池的具体实现 ThreadPoolExecutor 。 Executor /** * 线程池顶层接口 * 可以执行提交的命令 */ public interface Executor { /** * 执行提交的命令 * @param command */ void execute(Runnable command); } Executor 只定义了线程池一个行为 execute() 方法,负责执行提交的任务。 ExecutorService package java.util.concurrent; import java.util.List; import java

java基础--12

强颜欢笑 提交于 2020-04-02 14:14:53
1、线程间通信--示例代码 其实就是多个线程在操作同一个资源,但是操作的动作不同 2、解决安全问题 3、等待唤醒机制 wait() notify() notifyall() 都使用在同步中,因为要对持有监视器(锁)的线程操作 为什么这些操作线程的方法要定义在Object类中呢? 因为这些方法在操作同步中线程时,都必须要标识他们所操作线程持有的锁, 只有同一个锁上的被等待线程可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒 也就是说等待和唤醒必须是同一个锁。 而锁可以是任意对象,所以可以被任意对象调用的方法定义在Object类中 public class InputOutputDemo { public static void main(String[] args) { Res r=new Res(); Input input=new Input(r); Output output=new Output(r); Thread t1=new Thread(input); Thread t2=new Thread(output); t1.start(); t2.start(); } } class Res { String name; String sex; boolean flag=false; } class Input implements Runnable {

异常体系

随声附和 提交于 2020-04-02 11:17:42
异常的概述 Exception,在程序中能够强制编译器来处理程序执行中的发 生的并不是由程序本身所造成的错误。这个处理方法在java中就叫做异常捕获, 而这些并不是程序本身产生的错误就叫做“异常”。 基本异常 举一个抛出异常的简单样例,对于对像引用f,传给你的时候可能没有初始化。 那么在使用这个对象调用其方法前能够先对它进行检查。像这样: if(f==null) throws new NullPointerException(); 这就是抛出了一个异常,那么在当前环境下就不必操心这个可能出现的空指针异常了。 它将在别的地方获得处理。 使用异常处理机制的优点就是异常同意我们强制程序停止执行。 并告诉我们出现了什么问题。或者强制程序处理问题,并返回稳定状态。 异常处理程序 假设要将抛出的异常进行恰当的处理,就得准备对应的处理程序。 异常处理程序紧跟在try代码块之后,以keywordcatch表示: try{ //要尝试执行的代码 }catch(){ //处理该异常的代码 } (关于catch语句的异常类型:假设是catch语句的异常类型是CapacityToolException的父类, 那么程序也回进入到catch语句中。) 创建自己定义异常 java中不可能将全部的异常考虑的面面俱到。 所以有必要通过自己写的异常类来处理各种可能出现的异常, 要定义异常类。必须从已有的异常类中继承

异常体系

空扰寡人 提交于 2020-04-02 11:17:04
异常体系 异常的根类是java.lang.Throwable,旗下有两个子类: ⑴、编译时异常(Checked异常):java.lang.Error ⑵、运行时异常(Runtime异常):java.langException throwable中的常用方法: ⑴、public void printStackTrace():打印异常的 详 细信息,包含了异常的类型、异常的原因,还包 括异常出现的位置,在开发和调试阶段都得使 用printStackTrace。 ⑵、public string getMessage():获取发生异常的 原因。 ⑶、public string toString():获取异常的类型和异常描述信息。 ㈠、异常处理 一次捕获,多次处理 ⑴、try:代码块内放置可能引发异常的代码块 ⑵、catch:后对应异常类型和一个代码块,用于处理这种 类型的代码块 ⑶、finally:用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行 ⑷、throw:用于抛出一个实际的异常 ⑸、throws:主要在方法签名中使用,用于声明该方法可能抛出的异常 ㈡、处理异常的方式 ⑴、该方法不处理,声明抛出(throws)方法的调用者jvm(中断、打印) ⑵、try…catch处理异常(捕获异常) try{ }catch{ }finally{ } NB:异常处理可以嵌套

JavaWeb数据库应用开发基础

扶醉桌前 提交于 2020-04-02 06:13:50
JavaWeb数据库应用 JavaWeb数据库应用开发的几种方式 一、JSP+JDBC 二、JSP+Servlet(+JDBC) 三、JSP+Servlet+DAO(+JDBC) 四、JSP+Servlet+DAO(+JDBC)+JavaBean JavaWeb数据库应用开发的几种方式 以下总结了课程中学习的四种JavaWeb数据库应用开发方式,其中第前两种适合业务逻辑和功能简单的系统;后两种则是经典的MVC开发模式,推荐大家主要采用这种方式。此外,在有一定基础后可以学习使用主流开发框架,如Spring等,开发企业级应用。 一、JSP+JDBC 1.新建前端JSP页面,通过表单或超链接方式提交请求及参数到后端JSP页面。 2.新建后端JSP页面,导入JDBC相关包和类,连接数据库并接收前端请求参数,执行sql语句,最后输出结果并进行响应。 实验:参见实验db_ex1.jsp至db_ex5.jsp 二、JSP+Servlet(+JDBC) 1.新建前端JSP页面,通过表单或超链接方式提交请求及参数到servlet的URL(注意,servlet的URL地址可以进行配置)。 2.新建Servlet类,并配置URL映射。导入JDBC相关包和类,连接数据库并接收前端请求参数,执行sql语句,最后输出结果并进行响应。(注意

商品信息系统

房东的猫 提交于 2020-04-01 17:53:12
entity层 package com.hjf.entity; public class Course { private int id; private String name; private String place; private String guige; private String number; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPlace() { return place; } public void setPlace(String place) { this.place = place; } public String getGuige() { return guige; } public void setGuige(String guige) { this.guige = guige; } public String getNumber() { return number; } public void

Java并发(思维导图)

北城以北 提交于 2020-04-01 01:47:18
1,线程状态转换 无限期等待: 限期等待: 线程生命流程: 2,实现方式 代码实现样例【三种方式】: package com.cnblogs.mufasa.demo2; import java.util.concurrent.Callable; public class test1_Runnable implements Runnable{ @Override public void run() { for(int i=0;i<50;i++){ System.out.println("当前线程:"+i); } } } class test2_Callable implements Callable<String> { private int num; public test2_Callable(){} public test2_Callable(int num){ this.num=num; } @Override public String call() throws Exception { for(int i=0;i<50;i++){ System.out.println(this.num+"线程:"+i); } return num+"线程已完成"; } } class test3_Thread extends Thread { private int num; public

Shiro安全框架

那年仲夏 提交于 2020-03-31 08:59:31
Shiro简介 Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和 会话管理等功能。 对于任何一个应用程序,Shiro都可以提供全面的安全管理服务。其不仅可 以用在JavaSE环境,也可以用在JavaEE环境。 二、Shiro架构图 1.从外部来看Shiro,即从应用程序角度来观察如何使用Shiro完成工作。如 下图: 2.从Shiro内部看Shiro的架构,如下图所示: Subject(org.apache.shiro.subject.Subject) 当前与软 件进行交互的实体(用户,第三方服务,cron job,等 等)的安全特定“视图” SecurityManager :SecurityManager 是 Shiro 架构的 心脏。它基本上是一个“保护伞”对象,协调其管理的组 件 以 确 保 它 们 能 够 一 起 顺 利 的 工 作 类 似 于SpringMVC中的入口 servlet Realms :域 Realms 在 Shiro 和你的应用程序的安全数据之间担当 “桥梁”或“连接器”。当它实际上与安全相关的数据如用 来执行身份验证(登录)及授权(访问控制)的用户帐户交互时, Shiro从一个或多个为应用程序配置的Real中寻找许多这样的东西 Shiro 的环境搭建 使用 shiro 实现登陆的操作 第一步 导包 第二步:书写

Java回顾之多线程同步

这一生的挚爱 提交于 2020-03-29 12:48:23
在这篇文章里,我们关注线程同步的话题。这是比多线程更复杂,稍不留意,我们就会“掉到坑里”,而且和单线程程序不同,多线程的错误是否每次都出现,也是不固定的,这给调试也带来了很大的挑战。   在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的“线程池”,JDK为我们提供了一个很大的concurrent工具包,最后我们会对里面的内容进行探索。   为什么要线程同步?   说到线程同步,大部分情况下, 我们是在针对“ 单对象多线程 ”的情况进行讨论,一般会将其分成两部分,一部分是关于“共享变量”,一部分关于“执行步骤”。   共享变量   当我们在线程对象(Runnable)中定义了全局变量,run方法会修改该变量时,如果有多个线程同时使用该线程对象,那么就会造成全局变量的值被同时修改,造成错误。我们来看下面的代码: 1 class MyRunner implements Runnable 2 { 3 public int sum = 0; 4 5 public void run() 6 { 7 System.out.println(Thread.currentThread().getName() + " Start."); 8 for (int i = 1; i <= 100; i++) 9 {

ativemq使用教程

邮差的信 提交于 2020-03-28 14:55:57
本文转自http://www.cnblogs.com/zhuxiaojie/p/5564187.html 目录: 一:JMQ的两种消息模式 1.1:点对点的消息模式 1.2:订阅模式 二:点对点的实现代码 2.1:点对点的发送端 2.2:点对点的接收端 三:订阅/发布模式的实现代码 3.1:订阅模式的发送端 3.2:订阅模式的接收端 四:发送消息的数据类型 4.1:传递javabean对象 4.2:发送文件 五:ActiveMQ的应用 5.1:保证消息的成功处理 5.2:避免消息队列的并发 5.2.1:主动接收队列消息 5.2.2:使用多个接收端 5.3:消息有效期的管理 5.4:过期消息,处理失败的消息如何处理 六:ActiveMQ的安全配置   6.1:管理后台的密码设置 6.2:生产消费者的连接密码 一:JMQ的两种消息模式 消息列队有两种消息模式,一种是点对点的消息模式,还有一种就是订阅的模式. 1.1:点对点的消息模式 点对点的模式主要建立在一个队列上面,当连接一个列队的时候,发送端不需要知道接收端是否正在接收,可以直接向ActiveMQ发送消息,发送的消息,将会先进入队列中,如果有接收端在监听,则会发向接收端,如果没有接收端接收,则会保存在activemq服务器,直到接收端接收消息,点对点的消息模式可以有多个发送端,多个接收端,但是一条消息,只会被一个接收端给接收到