Java基础12-多线程Thrad

<--
 注意:
  1.使用锁对象调用wait()方法!!!!
  2.直接调用run()方法不会启动线程,注意其在main中的执行过程.
-->


一.多线程
 1.创建线程
  a.定义一个类继承Thread类, 重写run()方法, 创建该类对象, 调用start()方法.
   程序会开启一条新线程, 在新线程上自动调用run()方法.
   
  b.定义一个类实现Runnable接口, 实现run()方法, 创建Thread对象, 构造函数中传入Runnable对象, 调用start()方法.
   程序会开启一条新线程, 在新线程上自动调用Runnable的run()方法.
   
 2.Thread类常用方法
 
 a.currentThread()
   获取当前线程对象
   
 
 b.getName()
   获取线程的名字
   
  c.setName(String)
   设置线程的名字
   
  d.sleep(long)
   控制线程休眠指定毫秒
   
  e.setDaemon(boolean)
   设置线程为后台(守护)线程, 后台线程不会单独执行. 注意, 必须在线程开启之前设置.
   
  f.join()
   当前线程暂停, 指定线程加入, 等待指定线程执行结束, 当前线程继续
   
 3.同步
 
 a.同步代码块
   使用synchronized(锁对象){ 同步代码 }方式定义同步代码块
   多个同步代码块如果使用相同的锁对象, 那么同一时间内只能执行一个
   
  b.同步方法
   如果整个方法内的代码都需要同步, 那么可以在方法声明上加上synchronized
   在同一个对象上的同步方法, 同一时间只能执行一个
   同步方法默认使用this作为锁对象
   如果希望同步方法和同步代码块进行同步, 那么同步代码块也要自划定锁对象为this
   
  c.什么时候用同步
   两个线程在执行两段代码的时候, 其中一段代码执行的过程中不希望CPU切换到另一段代码.
   可以将两段代码放在同步代码块中, 使用相同的锁对象, 这样同一时间内只能执行一段代码.
   
  d.线程安全问题
   当多个线程并发访问同一数据, 有可能出现线程安全问题.
   这时就可以使用同步技术来解决, 将访问数据的代码放在同步代码块中, 这样做同一时间只能有一条线程访问数据.
   
 
 e.死锁
   在多线程并发执行的时候, 尽量避免多层同步代码嵌套使用, 有可能互相冲突, 造成死锁
   
 4.通信
  a.等待
   使用锁对象的wait()方法进行等待

  b.唤醒
   使用锁对象的notify()方法进行唤醒, 该方法是唤醒随机一个线程
   使用notifyAll()方法可以唤醒所有等待的线程
   
 5.JDK5的同步
  使用ReentrantLock类创建一个锁对象, 在需要同步的代码前执行lock()方法, 同步结束的地方unlock()
 
如: 
  ReentrantLock lock = new ReentrantLock();
  lock.lock();
  lock.unlock();
  
 6.JDK5的通信
  使用ReentrantLock可以调用newCondition()方法创建Condition对象
  使用Condition对象await()方法可以控制当前线程等待
  使用Condition对象的signal()方法可以唤醒指定的线程
 如:
  Condition c1 = lock.newCondition();
  Condition c2 = lock.newCondition();
  c1.await();
  c2.signal();  
  c2.await()
  c1.signal();
  
  signalAll()
 
二.Timer类
 1.创建计时器
  Timer timer = new Timer();
  
 2.安排任务
  schedule(TimerTask task, long delay)
  安排一个任务, 等待delay毫秒后执行
  
  schedule(TimerTask task, long delay, long period)
  安排一个任务, 等待delay毫秒后执行, 每隔period毫秒再执行
  
  schedule(TimerTask task, Date time)
  安排一个任务, 等待time时间开始执行
  
  schedule(TimerTask task, Date firstTime, long period)
  安排一个任务, 等待firstTime时间开始执行, 每隔period毫秒再执行
 
如:
  Timer timer = new Timer();
  timer.schedule(new TimerTask() {
    @Override
    public void run() {
     //code
    }

   },3000);  
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值