主要内容
- 线程
- 同步
- 线程同步
1 线程
每个线程都有自己独立的栈空间
1.1Thread类
- 构造方法
public Thread():分配一个新的线程对象。 public Thread(String name):分配一个指定名字的线程对象 public Thread(Runnable target):分配一个指定目标的新的线程对象 public Thread(Runnable target,String name):分配一个指定目标的新的线程对象并指定名字
- 常用方法
public String getName():获取线程名称 public void start():执行线程 public void run():线程的任务自此处定义代码 public static void sleep(long mills):让线程暂停执行指定毫秒 public static Thread currentThread():返回正在执行的线程对象
1.2创建线程方式二
1.定义Runnable接口实现类,重写run()方法。
2.创建其实现类的对象,作为Thread的参数创建Thread线程对象。
3.调用线程对象的start()方法开启线程。public static void main(String[] args) { //创建自定义类对象 线程任务对象 MyRunnable mr = new MyRunnable(); //创建线程对象 Thread t = new Thread(mr, "小强"); t.start(); } }
1.3 Thread和Runnable的区别
- 实现Runnable接口:
1.更适合共享同一资源
2.避免了单继承的局限
3.代码更加灵活,实现解耦操作
4.线程池只能放实现Runnable接口或Callable类线程,不能直接放入继承Thread的类
1.4匿名内部类方式实现线程创建
- 使用线程的匿名内部类方式,可以方便实现每个线程执行不同的线程任务操作
使用匿名内部类的方式实现Runnable接口,重写其run()方法 Runnable r = new Runnable(){ public void run(){ for (int i = 0; i < 20; i++) { System.out.println("张宇:"+i); } } }; new Thread(r).start();
2 线程安全
2.1线程安全
多个线程操作同一个数据,出现多个线程对一个变量同时读写操作
2.2 线程同步
解决线程安全问题
- 同步代码块
- 同步方法
- 锁机制
2.3 同步代码块
- 格式:synchronize(锁对象){…}
- 锁对象
- 锁对象 可以是任意类型。
- 多个线程对象 要使用同一把锁。
2.4 同步方法
- 格式:public synchronized void method() {…}
- 同步锁:
普通成员方法,同步锁就是this。
static方法,当前方法所在类的字节码对象(类名.class)。
2.5 Lock锁(接口)
ReentrantLock类实现了Lock接口
- public void lock():加锁
- public void unlock():释放锁
3线程状态
3.1线程概述
- NEW新建:创建线程,还未调用start();
- Runnable运行:cpu正在执行该线程
- Blocked阻塞:一个线程获取锁时,锁被其他线程持有。
- Waiting无限等待:不能自动唤醒,必须等待另一个线程调用notify或者notifyAll方法进行唤醒此线程。
- TimedWaiting计时等待:一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态。
- Teminated被终止:线程执行完毕已退出的线程
3.2 Timed Waiting(计时等待)
run()方法中添加sleep语句,强制当前的线程休眠(暂停执行)
Thread.sleep(毫秒值);与锁无关,线程自动苏醒,返回到Runable状态
3.3 BLOCKED(锁阻塞)
3.4 Waiting(无限等待)
3.5补充
3.6 wait&¬ify
- public final void wait() throws InterruptedExcception
在其他线程调用此对象的notify()/notifyAll()方法前,导致当前线程等待。相当于调用wait(0)。
1.同步锁调用此方法
2.必须存在于同步代码块中- public final void notify()
唤醒在此对象监视器上(同步锁)等待的单个线程。- public final void notifyAll()
唤醒在此对象上(同步锁)等待的所有进程。