Synchronized和Lock

Synchronized关键字 1.作用 保证同一时刻最多只有1个线程执行 被Synchronized修饰的方法 / 代码 其他线程 必须等待当前线程执行完该方法 / 代码块后才能执行该方法 / 代码块 2.修饰 2.1修饰方法 //对象锁 //写法1 public synchronized void method() { // todo } //写法2,写法2其实是同步代码块的写法,但在这里也是相当于修饰了方法 public void method() { synchronized(this) { // todo } } 2.2修饰静态方法 //类锁 public synchronized static void method() { // todo } 2.3修饰类 //类锁 class ClassName { public void method() { synchronized(ClassName.class) { // todo } } } 2.4修饰代码块 //对象锁 //写法一 synchronized(this) { //todo } ' //写法二 Object obj =new Object(); synchronized(obj) { //todo } 2.……

阅读全文

Future、FutureTask、CompletableFuture

Future、FutureTask、CompletableFuture Future Feature接口 public interface Future<V> { /** * 取消任务的执行 * 如果任务已经完成,或者已经被取消,或者因为其他原因不能被取消,则返回失败 * 如果任务在调用时还未启动,那么返回成功 * 如果任务已经在执行过程中,则根据参数确定此执行任务的线程能否被中断,来试图停止任务的执行 * @param mayInterruptIfRunning * @return */ boolean cancel(boolean mayInterruptIfRunning); /** * 判断任务是否已经取消,任务正常完成前将其取消,则返回true * @return */ boolean isCancelled(); /** * 判断任务是否已经完成,需要注意的是如果任务正常、异常或取消,都返回true * @return */ boolean isDone(); /** * 等待任务执行结束,并返回结果 * @return * @throws InterruptedException 线程被中断异常 * @throws ExecutionException 任务执行异常 */ V get() throws InterruptedException, ExecutionException; /** * 等待任务执行结束,并返回结果,同上面get方法的区别是设置了超时时间, * @param timeout * @param unit * @return * @throws InterruptedException * @throws ExecutionException * @throws TimeoutException */ V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; } FutureTask介绍 Future只是一个接口,无法直接创建对象,因此有了FutureTask。RunnableFuture继承了Runnable和Future接口,而FutureTask实现了RunnableFuture接口。 Future是一个接口, FutureTask类是Future 的一个实现类,并实现了Runnable,因此FutureTask可以传递到线程对象Thread中新建一个线程执行。 FutureTask实现了RunnableFuture接口,而RunnableFuture继承了Runnable和Future,也就是说FutureTask既是Runnable,也是Future。……

阅读全文

短语

Managerial tasks could be delegated to others 管理任务可以委托给其他人……

阅读全文

linux命令

一行shell命令杀死指定进程名称的进程方法 ps -efww|grep -w '程序名称'|grep -v grep|cut -c 9-15|xargs kill -9 杀死程序名称为ssz-h5的程序 [root@sagdb ssz-h5]# ps -ef|grep java root 28414 1 2 Sep27 ? 05:39:12 java -jar ssz-llyy.jar root 29837 1 99 14:37 pts/0 00:00:03 java -jar ssz-h5.jar root 29856 29557 0 14:37 pts/0 00:00:00 grep java [root@sagdb ssz-h5]# ps -efww|grep -w 'ssz-h5'|grep -v grep|cut -c 9-15|xargs kill -9 远程启动脚本 nohup java -Xdebug -Xrunjdwp:transport=dt_socket,address=2345,server=y,suspend=n -jar ssz-h5.jar testinfo2 > h5.……

阅读全文

Thread、Runnable、Callable、线程池

1.创建线程的三种方式 (1)继承thread,重写run方法 (2)实现Runnable接口,实现run方法 (3)实现Callable接口,实现call方法 (4)线程池 2.Runnable和Callable的区别: (1)Callable实现的方法是call(),Runnable实现的方法是run(). (2)Callable的任务执行后可返回值,可以拿到一个Future对象,而Runnable的任务没有返回值 (3)call方法需要抛出异常InterruptedException和ExecutionExecption,run方法只能在内部消化InterruptedException 3.Thread的缺点: Java是单继承多实现,不利于扩展. 4. 线程池 4.1 为什么要使用线程池 降低资源消耗。 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。 线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 4.2 execute()和submit()的区别 (1)可接受任务类型: submit: submit(Callable<T> task):Future<T> -ExecutorService submit(Runnable task):Future<?> -ExecutorService submit(Runnable task,T result):Future<T> -ExecutorService execute: execute(Runnable command):void -Executor 从源码种可以看出 execute只能接受Runnable类型的任务 submit不管是Runnable还是Callable类型的任务都可以接受 (2)返回值 由Callable和Runnable的区别可以看出: execute没有返回值 submit有返回值,所以需要返回值的时候必须使用submit (3)异常处理 submit在执行过程中与execute不一样,不会抛出异常而是把异常保存在成员变量中,在FutureTask.get阻塞获取的时候再把异常抛出来。 execute中抛出异常 execute中的是Runnable接口的实现,所以只能使用try、catch来捕获CheckedException,通过实现UncaughtExceptionHande接口处理UncheckedException 即和普通线程的处理方式完全一致……

阅读全文

创建型模式

创建型模式 1.简单工厂模式(静态工厂方法模式) 2.工厂方法模式 3.抽象工厂模式 4.建造者模式 5.单例模式 6.原型模式 1.简单工厂模式(静态工厂方法模式) 作用:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。 应用场景:Java加解密 (解密)获取不同加密算法的密钥生成器: KeyGenerator keyGen=KeyGenerator.getInstance("AES"); (加密)创建密码器: Cipher cp=Cipher.getInstance("AES","BC"); 2.工厂方法模式 作用:当需要加入新产品时,对原有产品无需改动,只需要新增一个抽象工厂和具体产品就可以了。 主要角色: 抽象工厂(Abstract Factory) 具体工厂(ConcreteFactory) 抽象产品(Product) 具体产品(ConcreteProduct) 应用场景:JDBC中的工厂方法 比如加载不同厂商的数据库驱动 Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=DB;user=;password="); Statement statement=conn.createStatement(); ResultSet rs=statement.executeQuery("select * from UserInfo"); 3.抽象工厂模式 4.建造者模式 作用:将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变,但每一部分是可以灵活选择。 优点 封装性好,构建和表示分离。 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。 主要角色 Builder:抽象建造者 Concrete Builder:具体建造者 Director:指挥者 Product:产品角色 应用场景StringBuilder.append源码 public StringBuilder append(boolean b) { super.……

阅读全文

异常

异常和错误的区别:异常能被程序本身处理,错误是无法处理。 异常层次结构图 ……

阅读全文

结构型模式

结构型模式 1.适配器模式 2.装饰器模式 3.代理模式 4.外观模式(门面模式) 5.桥接模式 6.组合模式 7.享元模式 1.适配器模式 定义:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种。 类结构型模式适配器 对象结构型模式适配器 优点: 客户端通过适配器可以透明地调用目标接口。 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。 主要角色: 目标接口(Target):当前系统业务所期待的接口,它可以是抽象类或接口。 适配者类(Adaptee):它是被访问和适配的现存组件库中的组件接口。 适配器类(Adapter):它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。 实现: 类适配器: //目标接口 interface Target { public void targetMethod(); } //适配者类 class Adaptee { public void adapteeMethod() { System.out.println("适配者中的业务代码被调用!"); } } //类适配器类 class ClassAdapter extends Adaptee implements Target { public void targetMethod() { adapteeMethod(); } } //客户端代码 public class ClassAdapterTest { public static void main(String[] args) { System.……

阅读全文

行为型模式

行为型模式 1.策略模式 2.责任链模式 3.模板方法模式 4.观察者模式 5.迭代子模式 6.命令模式 7.备忘录模式 8.状态模式 9.访问者模式 10.中介者模式 11.解释器模式 1.策略模式 定义:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。 解决问题:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。将这些算法封装成一个一个的类,任意地替换。 主要角色: 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。 环境(Context)类:持有一个策略类的引用,最终给客户端调用。 实现: //抽象策略 public interface Strategy { public int doOperation(int num1, int num2); } //具体策略 public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } } //Context上下文 public class Context { private Strategy strategy; public Context(Strategy strategy){ this.……

阅读全文