Java基础第二十一天--多线程2

1. 几个小问题
 1)一个线程对象,可以多次调用start()方法吗?
  不能,否则会有java.lang.IllegalThreadStateException异常
  指示线程没有处于请求操作所要求的状态时抛出的异常
 2)多个线程是共享一个run()方法,还是每个线程对象执行的时候都走自己的run()方法
  每个线程对象有自己的run()方法执行,run里面封装的是被多线程操作的代码
  所以,每个线程拥有自己的一个run()方法,但是,多个线程可以共同处理同一个资源

2. 死锁问题:多个线程使用多把锁,相互等待

3. JDK5以后的新同步操作--有一个Lock接口和一个实现了Lock接口的ReentrantLock类
 可以明确什么时候加锁,什么时候解锁

 class X{
  private final ReentrantLock lock = new ReentrantLock();
  
  public void m(){
    lock.lock();
    try{}
    finally{
      lock.unlock()
   }
  }
 }
 
4. 线程间的通信--不同种类的线程
 1)如何保证多个对象操作的是同一个资源?
 我们在测试类中创建了学生对象,然后把学生对象作为构造参数传递到不同的线程操作类中
 2)如果是种类不同的线程,请保证这多个线程的锁必须是同一把
 
5. 唤醒机制--wait() +  notify()组合
 Object类 有 wait()和notify()方法
 
 wait()方法的特点:
  哪里等待,从哪里释放锁。将来醒过来的时候,是从上次等待的地方醒过来的
 
 一个面试题:sleep()和wait()的区别?
 1)sleep()表示睡眠,必须指定时间;不释放锁
 2)wait()表示等待,可以指定时间,也可以不指定时间;释放锁
 
6. Thread类下每个线程都有一个优先级
 public final void setPriority(int newPriority)
 public final int getPriority()
 
 线程默认优先级是5 MAX_PRIORITY--10  MIN_PRIORITY--1
 
 线程的优先级一般情况下效果不大
 在次数特别多的情况下,线程优先级高的对象可能比线程优先级低的先获取到优先权
 
7. 暂停线程
 public static void yield() --暂停正在执行的线程对象,并执行其他线程
 暂停线程可以在一定程度上,让线程间运行的可以和谐一些
 如果想保证数据和谐,请采用等待唤醒机制
 
8. public final void join()
 其他线程必须等待加入线程执行完毕后才能执行
 注意:加入线程是必须在线程start()后的动作
 
9. 守护线程:
 主线程结束了,那么所有守护线程就都立刻结束

10. 最简单的线程程序代码

 new Thread(){
  public void run(){
   //code...
  }
 }.start();
 
 new Thread(new Runnable(){
  public void run(){
   //code...
  }
 }).start();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值