较为详细扩展的文章可参见这篇博客:
https://blog.csdn.net/qq_34337272/article/details/79640870
一、线程定义
线程是进程中执行运算的最小单位,是进程内部的一个执行单元
1、多个线程同时进行,采用枪占的机制,单核计算机一个时间只有一个线程执行,采用枪占资源的方式
二、多线程的优势
1、最大限度的提高计算机系统的利用效率
2、充分利用网络和系统资源
三、主线程
main方法为主线程入口
主线程必须最后执行
四、创建线程
1、继承Thread类
重写run方法
测试中只需要创建线程对象即可
2、实现Runnable接口
测试诶中创建线程时候,需要
Thread thread=new Thread(m,name);
m为线程类的实例
name为此线程的名字
两种方法的区别
Thread方法较简单,适用于单继承
Runnable很好的避免了java中的单根继承,并且使用这种方法可以共享数据资源。
五、线程的状态
1、新生(创建)
new但是还没调用start方法
2、就绪
调用了start方法,但是未抢到CPU的资源
3、运行
执行run方法
4、阻塞
是一种不可运行状态,造成阻塞的原因:
*执行Thread.sleep()方法
*IO操作时,IO操作未完成
*需要得到琐,但是琐被占用
5、死亡
退出main方法
六、线程调度
1、线程优先级
①设置优先级
setPriority(int guid)
②1-10表示优先级,10最高,5为默认,每一个优先级对应Thread的一个公用静态常量
NORM_PRIORITY=5
MIN_PRIORITY=1
MAX_PRIORITY=10
线程的优先级只是表示一个抢到资源的概率,不一定每次优先级高的都先运行,只是表示有这种可能性
2、实现线程调度的方法
①sleep
静态方法
要用Thread.sleep(1000);括号内为毫秒数
强制让线程休眠
②join
非静态方法
线程名.join();
谁调用join方法,该线程就先执行完,也有可能出现要加入的线程在未达到join条件时就已执行完毕,这时候join就不起作用了。
③yield
静态方法
Thread.yield
线程的礼让
可以让当前线程暂停执行,允许其他线程执行,但该线程任然可运行状态,此时,系统选择其他或更高优先级的线程执行,如无其他,则该线程继续执行,
七、线程同步
高并发安全性问题:马上双十一了,很多多人同一时间点会访问同一数据,这时候线程安全就很重要了
线程同步:
所谓线程同步就是当两个或多个线程要访问同一资源时,需要以某种顺序来确保某一时刻只能一个线程使用的方式
1、同步代码块
在访问修饰符前或后加synchronized,比如这个例子
package demo4; /* * 线程同步测试 * 1、同步代码块 */ public class MyThread implements Runnable { private int count=10;//显示余票 private int piao;//显示抢到几张票 @Override public void run() { while(true) { synchronized (this) { if (count <= 0) { break; } count--; piao++; //模拟网络延迟 try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "抢到弟" + piao + "张票,剩余" + count + "张票!"); } } } }
注意:eclipse自动生成同步代码块的快捷键
右键——Surround with——synchronized...
2、同步方法
package demo5; /* * 线程同步测试 * 2、同步方法 */ public class MyThread implements Runnable { private int count=10;//显示余票 private int piao;//显示抢到几张票 boolean flag=true; @Override public void run() { while(flag) { buy(); } } synchronized public void buy() { if (count <= 0) { flag=false; return; } //模拟网络延迟 try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } count--; piao++; System.out.println(Thread.currentThread().getName() + "抢到弟" + this.piao + "张票,剩余" + this.count + "张票!"); } }
注意:并不是同步的代码越多越好,容易出现死锁现象
线程同步涉及的类和方法(重要)
1、ArryLit类的add方法:是非线程同步,不安全的
2、StringBuffer同步安全
StringBuilder非同步,不安全
3、线程安全的:能同步,共享资源,安全
非线程安全:效率高
4、HashMap:建只能有一个为空,值不能为空,不安全
Hashtable:键值都不允许为空,安全