引进线程定义是因为频繁创建销毁进程太麻烦,甚至浪费操作系统资源,所以引进线程来提升效率.
区别 :
1.进程包含了线程 ,线程被称为"轻量级进程".
2.进程是操作系统内资源分配的基本单位,线程是执行调度的基本单位.
3.同一个进程里面的线程共用同一份系统资源(包括内存/文件等),而进程里面的线程与线程各自是独立的 系统资源 (文件 ,内存).
线程 :
一.创建线程:
1.继承Thread类,重写run()方法.
2.实现Runnable接口,重写run方法
3.使用匿名内部类 ,创建Thread子类的方法
4.使用匿名内部类,实现Runnable接口来实现创建线程
5.lambda表达式(使用最多创建
线程)
二.线程中断
1.线程创建之后 通过Boolean控制线程进行中的状态来中断线程
在后面设置来中断
2.或者在进程开始之后强制设置中断(通过thread.interrupt()来中断)
进程开始之后 三秒打印三次"hello thread"后触发InterruptException异常后中断线程
三.线程安全
触发线程安全的原因:
1.抢占式执行
2.多个线程执行同时修改同一个变量
3.修改过程并不是"原子的"(原子:理解为不可分割的最小单位)
4.内存可见性也会引发线程不安全问题
5.指令重排序问题
由于在线程跑起来时多个线程并没有规定哪个线程跑多哪任务 哪个线程跑多少,还可能线程正执行任务时被操作系统调度走,而去执行其他的任务.这样就会发生线程不安全的情况
四.线程阻塞
由于线程可能会发生线程不安全的情况 ,为解决这一问题便需要加锁操作 关键字为synchronize
放在访问修饰限定符后 返回值之前 public synchronize void 方法名(){};
当一个线程加锁操作之后另一线程就必须阻塞等待 ,直到前一线程解锁操作之后才可以执行任务 .这样一来就不会发生线程不安全的情况;
另外 在线程开始start()之后
调用 thread线程.join();操作来阻塞 ,可以设置休眠时间 ;