Java多线程随笔

来源:互联网 发布:标准篮球场数据 编辑:程序博客网 时间:2024/05/16 15:19

Java多线程

停止线程

  • interrupt()
- Thread.interrupt();//静态方法- Thread.currentThread().interrupt();//实例方法

interrupt()方法只是提供了一个标志位,通常还需要借助thread.isInterrupted()方法判断,然后抛出异常的方式来真正的终止线程(建议使用异常法终止线程,因为在catch块中还可以将异常向上抛,使得线程停止的事件得以传播sleep()interrupt()不能同时执行,会抛出InterruptedException异常

  • stop()
- thread.stop();//实例方法

已经过时的方法,会导致两个问题
- 清理工作得不到完成
- 数据出现不一致性,因为同步方法很可能就只执行了一半

暂停线程

  • suspend()

    暂停线程如果没有唤醒线程,将导致公共的同步对象的独占

  • resume()

 - thread.suspend();//实例方法 - thread.resume();//实例方法

yield方法

  放弃当前的cpu资源,使得同一优先级的线程得以执行(因为本质是恢复到可执行状态)
yield()也 不会释放锁标志。
  实际上,yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。

Thread.yield();//静态方法

sleep方法

  • sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;
  • sleep(long)可使优先级的线程得到执行的机会,当然也可以让优先级的线程有执行的机会;
  • sleep(long)不会释放锁标志的。

守护线程(Daemon)

  • 在Java线程中有两种线程,一种是用户线程,另一种是守护线程
  • Daemon的作用就是为其他线程的运行提供了便利服务,守护线程最典型的应用就是GC(垃圾回收器)。
  • 只有当最后一个非守护线程结束的时候,守护线程随着JVM一同结束工作。

synchronized关键字

  • 关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁,哪一个线程执行了带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能是呈现等待(是等价于阻塞的概念吗?)状态,前提是多个线程访问的是同一个对象的同步方法。
  • 如果两个线程访问同一个对象的两个同步的方法,则会有如下结论:
    • A线程先持有object对象的Lock锁,B线程仍然可以以异步的方式调用object对象中的非synchronized类型的方法
    • A线程先持有object对象的Lock锁(还没有释放),B线程如果在这个时候调用object对象中的另一个synchronized类型的方法则仍然需等待,也就是同步(同一个对象的两个同步方法的依次执行)
0 0