Java多线程开启
1.直接new Thread 三个线程开启start();
2.通过 开启线程池 Excutors.newFixedThreadPool(int i);
最后分配任务对象给线程池的线程去工作
结束线程池: shutDown();
并发,从宏观方面来说,并发就是同时进行多种时间,实际上,这几种时间,并不是同时进行的,而是交替进行的,而由于CPU的运算速度非常的快,会造成我们的一种错觉,就是在同一时间内进行了多种事情。
第一条线程先抢占到CPU资源,他刚刚进行了第一次操作,而此时第二条线程抢占到了CPU的资源,name,共享资源还来不及发生变化,就同时有两条数据使用了同一条资源,具体请参考多线程买票问题。这个问题我们应该如何解决那?
在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念
使用submit()将任务对象提交到线程池
shutdown 结束线程池。
生产者消费者问题
需要使用对象锁 obj 使用同步代码块访问临界资源。
使用wait()这个是object的方法不属于线程方法,释放对象锁,使得当前线程阻塞。
notify()唤醒所有wait()状态的线程,让他们去抢夺锁。
单例设计模式
1.私有化的构造方法
2,私有化的内部对象,即在类里面new自己
3.提供方法给外界获取类的对象
饿汉:
类的对象随着类的加载就创建对象
这样线程比较安全,但是不够优化
懒汉:
类的对象并没有随着类的加载而创建
只有当他想创建的时候创建,注意:
判断对象是否为空时,需要价格同步锁,可能多线程会不安全,有多个对象的状态
枚举
//Color.name是枚举变量名即枚举对象
//枚举对象.方法名就是枚举对象对应方法的对应名
System.out.println(Color.Blue.getType());// 输出蓝色 Red(1,"红色"),Blue(2,"蓝色") ;
System.out.println(Color.Blue.name());// 输出blue Red(1,"红色"),Blue(2,"蓝色") ;
System.out.println(Color.Blue.getI());
System.out.println(Color.Red.ordinal()); //默认从声明实例对象序号为0开始
枚举类不能继承其它类,构造方法是私有的。类似于多个对象的单例模式
在enum类型里面
public enum Color{
Red(自己写一个构造参数); 都是实例对象
name():返回实例名。
实例就好像是Red一样 把它看成方法,默认调用无参的构造,可以自己定义有参
ordinal():返回实例声明时的次序,从0开始。
果要为enum定义方法,那么必须在enum的最后一个实例尾部添加一个分号。此外,在enum中,必须先定义实例,不能将字段或方法定义在实例前面。否则,编译器会报错。