新程序猿笔记Day17

 线程创建的其他方式





 ExecutorService/Executors

ExecutorService:用来存储线程的池子,把新建线程/启动线程/

  • execute(Runnable任务对象) 把任务丢到线程池  

关闭线程的任务都交给池来管理

Executors 辅助创建线程池的工具类 

  • newFixedThreadPool(int nThreads) 最多n个线程的线程池

  • newCachedThreadPool() 足够多的线程,使任务不必等待

  • newSingleThreadExecutor() 只有一个线程的线程池

  •  常用方法:newFixedThreadPool(int)这个方法可以创建指定数目线程的线程池对象
    创建出来的线程吃对象就是ExecutorService,负责:新建/启动/销毁 线程
    使用Executors工具创建一个最多个线程的线程池对象ExecutorService

eg:测试

package cn.tedu.review;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*复写实现接口方式的售票案例*/
public class TicketRunnable {
    public static void main(String[] args) {
        TicketR target = new TicketR();
//        Thread t = new Thread(target);
//        Thread t1 = new Thread(target);
//        Thread t2 = new Thread(target);
//        Thread t3 = new Thread(target);
//        t.start();
//        t1.start();
//        t2.start();
//        t3.start();
        /*Executors是用来辅助创建线程池的工具类
         * 常用方法:newFixedThreadPool(int)这个方法可以创建指定数目线程的线程池对象
         * 创建出来的线程吃对象就是ExecutorService,负责:新建/启动/销毁 线程*/
        //7.使用Executors工具创建一个最多有5个线程的线程池对象ExecutorService
        ExecutorService pool = Executors.newFixedThreadPool(5);
        for (int i = 0; i <5 ; i++) {
            /*execute()让线程池中的线程来执行业务,每次调用都会将一个线程加入就绪队列*/
            pool.execute(target);
        }

    }
}

//1.创建自定义业务类
class TicketR implements Runnable {
    //3.定义变量用来保存票数
    int ticket = 100;
    Object o = new Object();

    //2.实现父接口中实现的方法,里面是我们的业务
    @Override
    public void run() {
        //3.循环买票,是一个死循环,没票的时候就break
        while (true) {
            synchronized (o) {
                if (ticket > 0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "=" + ticket--);
                }
                if (ticket <= 0) break;
            }
        }
    }
}

单元测试方法
它是Java运行程序的最小单位
格式:@Test + public + void + 没有参数

 反射
反射的概念:
当我们想要使用别人的东西或者查看某些资源的时候,可以使用反射技术
再比如,开发的时候,有时并不能直接看到源代码,也可以通过反射获取

 反射的前提:获取字节码对象
字节码对象获取的3种方式:

类名.class
Class.forName(“目标类的全路径”)
目标类对象.getClass()
注意: 字节码对象是获取目标对象所有信息的入口
 反射的常用方法
获取包对象:clazz.getPackage()
先获取包对象,再获取包对象的名字:clazz.getPackage().getName()
获取类名:
clazz.getName()–打印的是全路径名
clazz.getSimpleName()–打印的只有目标类的类名

eg:测试 :

 注解分类的

  • JDK自带注解
  • 元注解
  • 自定义注解

 JDK注解
JDK注解的注解,就5个:

@Override :用来标识重写方法(重点掌握,其他的认识就可以)
@Deprecated标记就表明这个方法已经过时了,但我就要用,别提示我过期
@SuppressWarnings(“deprecation”) 忽略警告
@SafeVarargs jdk1.7出现,堆污染,不常用
@FunctionallInterface jdk1.8出现,配合函数式编程拉姆达表达式,不常用

元注解
用来描述注解的注解,就5个:

@Target 注解用在哪里:类上、方法上、属性上等等
@Retention 注解的生命周期:源文件中、字节码文件中、运行中(重点掌握,其他的认识就可以)

@Inherited 允许子注解继承
@Documented 生成javadoc时会包含注解,不常用
@Repeatable注解为可重复类型注解,可以在同一个地方多次使用,不常用

@Target ElementType…  

描述注解存在的位置:

ElementType.TYPE 应用于类的元素
ElementType.METHOD 应用于方法级
ElementType.FIELD 应用于字段或属性(成员变量)
ElementType.ANNOTATION_TYPE 应用于注解类型
ElementType.CONSTRUCTOR 应用于构造函数
ElementType.LOCAL_VARIABLE 应用于局部变量
ElementType.PA                         CKAGE 应用于包声明
ElementType.PARAMETER 应用于方法的参数

通过元注解@Target规定自定义注解可以使用在那些位置
我们使用"ElementType.静态常量"的方式来指定自定义注解具体位置
而且,值可以写多个,格式:@Target({值1,值2,值3...})

@Retention RetentionPolicy…

通过元注解@Retention规定自定义注解的生命周期
* 我们使用"RetentionPolicy.静态常量"的方式来指定自定义注解具体的存活时间
* 注意:这里的值只能写一个:SOURCE RUNTIME CLASS

SOURCE 在源文件中有效(即源文件保留)



CLASS 在class文件中有效(即class保留)



RUNTIME 在运行时有效(即运行时保留)

 单例设计模式核心思路

  • 对本类构造方法私有化,防止外部调用构造方法创建对象
  • 创建全局唯一的对象,也做私有化处理
  • 通过自定义的公共方法将创建好的对象返回(类似封装属性后的getXxx() )

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值