java快速入门 (16)

**CountDownLatch **CountDownLatch可以代替wait/notify的使用,并去掉synchronized

import java.util.concurrent.CountDownLatch; public class CountDown { private static Integer i = 0; final static CountDownLatch countDown = new CountDownLatch(1); public void odd() { while (i < 10) { if (i % 2 == 1) { System.out.println(Thread.currentThread().getName() + " - " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } i++; countDown.countDown(); } else { try { countDown.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void even() { while (i < 10) { if (i % 2 == 0) { System.out.println(Thread.currentThread().getName() + " - " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } i++; countDown.countDown(); } else { try { countDown.await(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { CountDown countDown = new CountDown(); Thread t1 = new Thread(() -> countDown.odd(), "线程1"); Thread t2 = new Thread(() -> countDown.even(), "线程2"); t1.start(); t2.start(); } }

CyclicBarrier

import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class CyclicBarrierTest { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(3); new Thread(() -> { System.out.println(Thread.currentThread().getName() + ": 准备..."); try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println("全部启动完毕!"); }, "线程1").start(); new Thread(() -> { System.out.println(Thread.currentThread().getName() + ": 准备..."); try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println("全部启动完毕!"); }, "线程2").start(); new Thread(() -> { System.out.println(Thread.currentThread().getName() + ": 准备..."); try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println("全部启动完毕!"); }, "线程3").start(); } } 线程3: 准备... 线程2: 准备... 线程1: 准备... 全部启动完毕! 全部启动完毕! 全部启动完毕! 线程池

经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。

ExecutorService 和 Executors

ExecutorService:真正的线程池接口。常见子类ThreadPoolExecutor
void execute(Runnable command) :执行任务/命令,没有返回值,一般用来执
行Runnable

Future submit(Callable task):执行任务,有返回值,一般又来执行
Callable

void shutdown() :关闭连接池

Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池

13.注解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。

作用

不是程序本身 , 可以对程序作出解释.(这一点和注释(comment)没什么区别)

可以被其他程序(比如:编译器等)读取.

可以附加在package , class , method , field 等上面 , 相当于给他们添加了额外的辅助信息

我们可以通过反射机制实现对这些元数据的访问

格式

注解是以"@注释名"在代码中存在的

还可以添加一些参数值 , 例如:@SuppressWarnings(value="unchecked")

内置注解

image-20210809164852100


Java 定义了一套注解,共有 10 个,java7之前3 个在 java.lang 中, 4 个在 java.lang.annotation 中,后续增加三个

作用在代码的注解( java.lang )是 @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。 @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。 @SuppressWarnings - 指示编译器去忽略注解中声明的警告。 作用在其他注解的注解(或者说 元注解)是( java.lang.annotation)注解 @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。 @Documented - 标记这些注解是否包含在用户文档中。 @Target - 标记这个注解应该是哪种 Java 成员。 @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类) java7之后增加的注解 @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。 @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。 @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。 package com.annotation; //测试内置注解 import java.util.ArrayList; import java.util.List; //所有类默认继承Object类 public class Test1 extends Object { //@Override 表示方法重写 //--> 查看JDK帮助文档 //--> 测试名字不同产生的效果 @Override public String toString() { return super.toString(); } //方法过时了, 不建议使用 , 可能存在问题 , 并不是不能使用! //--> 查看JDK帮助文档 @Deprecated public static void stop(){ System.out.println("测试 @Deprecated"); } //@SuppressWarnings 抑制警告 , 可以传参数 //--> 查看JDK帮助文档 //查看源码:发现 参数类型 和 参数名称 , 并不是方法! @SuppressWarnings("all") public void sw(){ List list = new ArrayList(); } public static void main(String[] args) { stop(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfzgp.html