day06 【线程、同步】

主要内容

  • 线程
  • 同步
  • 线程同步

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(锁对象){…}
  • 锁对象
  1. 锁对象 可以是任意类型。
  2. 多个线程对象 要使用同一把锁。

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&&notify

  • public final void wait() throws InterruptedExcception
    在其他线程调用此对象的notify()/notifyAll()方法前,导致当前线程等待。相当于调用wait(0)。
    1.同步锁调用此方法
    2.必须存在于同步代码块中
  • public final void notify()
    唤醒在此对象监视器上(同步锁)等待的单个线程。
  • public final void notifyAll()
    唤醒在此对象上(同步锁)等待的所有进程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值