toByteArray():将当前的这个内存操作输出流对象转换成字节数组
多线程
如果程序的执行路径只有一条:单线程程序
如果一个程序的执行路径有多条:多线程程序
进程和线程的概念: 线程是依赖于进程存在的,
进程:关查任务管理器:正在运行的程序就是一个进程
进程来说:进程就是系统分配资源调用的一个独立单位.
多进程有什么意义?
1) 现在的计算机是一种多进程计算机,即在做一件事的时候能同事做另一件事.
2) 多进程是为了提高计算机CPU的使用率.
多进程:在一边打游戏,一边听音乐,这两个进程是同时进行的?
打游戏会开启一个游戏进程,在听音乐时开启一个音乐进程.两者不是同时同时进程,感觉是同时进行,其实并不是.由于Cpu的一点点时间片在两者之间进行高效的切换,
线程?
线程是依赖与进程存在,一个线程相当于进程中的任务
多线程的意义:
1) 一个进程中开启了多个任务,每一个任务(线程),他们在互相抢占CPU的执行权,(提高程序的执行效率)
2) 多项成在抢占CPU的执行权,特点:具有随机性
多线程:即一个程序的执行路径有多条.
面试题: Jvm,Java虚拟机是多线程代吗?
是一个多线程程序,由于Java虚拟机中自带了一个垃圾回收器,来确保程序不会轻易的造成内存溢出的问题.
至少开启了两条子线程:
1) 当前程序在执行代码的时候,会执行main()主线程.
2) 垃圾回收器会开启一个垃圾回收线程,来确保内存不会溢出,将不用的变量或者没有更多引用的对象回收掉.
要实现多线程程序,必须创建一个进程.
创建进程进行需要调用系统资源进行创建,但Java语言不能直接调用喜用资源.
C/C++语言是可以创建系统资源,然后用Java语言调用C/C++已经封装好的东西
Java----->类:Thread类
多线程程序的实现
1) 创建MyThread继承自Thread类
2) 在MyThread中重写run方法,run方法调用相当于调用了一个普通方法,并不会出现随机性;而start方法调用,其实是通过Jvm调用线程中的run方法来进行多个线程抢占CPU的执行权
3) 在主线程中,创建该类的实力对象,启动线程
并行和并发:
并行:指的是同一时间点
并发:值同一时间段.
为什么要重写run(),run\方法里面执行的事耗时的操作
如何获取线程名称,getName
my1.start()和my2.start()子线程都会执行这段代码,
默认优先级:5
priority方法
yield方法暂停当前正在执行的对象.
join 终止当前正在执行的对象
线程的生命周期
1) 新建状态: 创建实力对象(线程对象的创建)
2) 就绪状态:这些线程有执行资格,还具有Cpu的执行权
3) 线程阻塞状态: sleep(); notify();
4) 运行状态:调用start(),通过Jvm调用run()执行,被别人抢到CPU的执行权,状态变为3).
5) 死亡状态:线程对象没有更多的引用了,被垃圾回收器回收掉
守护线程
join()
yield()
stop()
setDeamon()
sleep()
wait()
面试题:多线程的实现方式有几种,分别是几种
笔试答三种方式,
第三种和线程池有关,Executor
口头答两种:继承Thread类,实现Runnable接口
实现的两种方式对比:
方式一:
1) 自定义一类MyThread继承子Thread类
2) 重写Thream类中的run()方法
3) 主线程中创建该线程类对象
4) 启动线程
注意:
1)启动线程使用start(),调用run方法相当于调用普通方法
2)一个线程不能启动多次,非法线程状态异常
方式2:
1) 自定义一个类:MyThread,实现Runnable接口
2) 实现run()方法
3) 主线程中创建MyRunnable对象
4) 在创建Thread类对象,将MyRunnable对象作为参数传递
5) 启动线程
Java的设计模式:
简单工厂模式.工厂方法模式,装饰者模式,单例模式
饿汉式:
懒汉式
(问的最多)
多个线程在抢占CPU的执行权,CPU的一点点时间片具有特性,:原子性操作(最基本)比如变量++/- -.
解决多线程安全问题的标准(也是判断一个多线程是否有安全问题的标准):
1) 当前是否是一个多线程环境
2) 多线程环境中是否有共享数据.
3) 是否有多条语句对共享语句进行操作
同步锁对象:synchronized(任意类).理解为门的开和关.一次只能进去一个线程.所以就不会出现一张票多个窗口同时出售问线程安全问题