每个进程都有独立的方法区和堆空间
每个线程都有自己独立的栈和独立的程序计数器,每个线程一份
一个进程当中里的多个线程可以共享进程当中的堆和方法区,使得线程之间的通信变得更高效。
多个线程,共享同一个进程中的方法区和堆
线程就是一个程序内部的一条执行路径
进程就是一个正在运行的程序,一个进程可以包含多个线程。
创建线程的方法:继承thread类,实现runnable接口
新建:thread对象被创建时就叫新建。
就绪:新建的线程被start()调用
运行:被cpu分配资源线程就执行了。
阻塞:
死亡:运行完或者被强制停止。stop(强制停止)
在java当中,通过同步机制,来解决线程的安全问题
方式1:同步代码块:synchronized( ) {
//需要被同步的代码,通过这样解决线程安全问题,
可能出现线程安全的代码,操作共享数据的代码,即需要被同步的代码
同步锁,任何对象都可以充当一个锁。 要求多个线程公用同一个吧锁
}
方式2:同步方法
同步原理:线程有锁才能去执行,无锁不能执行
创建线程的4种方式:
继承thread类
实现runnable接口
实现Callable接口
使用线程池创建
线程池好处:如果是自己创建线程那就要去创建和销毁,比较浪费资源,
线程池就是能提前创建多个线程,放到线程池中,将创建好的线程重复利用,避免了重复去创建和销毁线程的过程。
String:
如果是直接通过字面量给一个String赋值,此时的字符串值是声明在字符串常量池中,
字符串常量池中是不会存储相同内容的字符串的。
4种线程池:
newsingleThreadPoolExecutor
创建一个单线程的线程池,这个线程池只有一个线程在工作,一个单线程执行所有的任务,如果这个线程因为异常结束,就会创建一个新的线程来代替
newFixedThreadPool
创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大就会保持不变,如果某个线程因为异常而结束,那么线程池会补充一个线程池。
newCachedThreadPool
创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,它就会回收掉空闲的线程(60秒不执行任务),当任务数增加时,线程池就又会添加一些新线程来处理任务,
newScheduledThreadPool
创建一个大小无线的线程池
java种waitt和sleep方法额不同
wait会释放锁,而sleep会一直持有锁
notify和notfyall的区别
什么是threadLocal变量
每个线程都有一个threadLocal就是每个线程都拥有自己独立的一个变量,