美文网首页
BiBi - 并发编程 -8- 线程

BiBi - 并发编程 -8- 线程

作者: 奋飞的蜗牛ing | 来源:发表于2019-12-10 00:43 被阅读0次

    From:Java并发编程的艺术

    启动一个普通的Java程序所开启的线程

    1)main线程,程序入口
    2)Reference Handler - 清除引用的线程
    3)Finalizer - 调用对象finalize方法的线程
    4)Signal Dispatcher - 分发处理发送给JVM信号的线程

    finalize()方法

    finalize()方法 - 当对象覆盖finalize方法,并且还没有执行过,则会将其放入到F-Queue队列中,由一个低优先级线程执行该队列中对象的finalize方法调用,之后再由GC回收。可以在finalize()方法中对对象进行【复活】。

    线程优先级的设置

    设置线程优先级时,针对频繁阻塞【休眠或者I/O操作】的线程需要设置较高优先级;而针对偏重计算【需要较多CPU时间或者偏运算】的线程则设置较低的优先级,确保处理器不会被独占。即:需要I/O操作的优先级高,需要CPU运算的优先级低。

    提示:线程的优先级不能作为程序正确性的依赖,因为不同的JVM以及不同的操作系统上都会有差异。有的操作系统甚至忽略线程优先级的设定。

    Daemon线程

    1)主要被用作程序中的后台调度。
    2)当Java虚拟机中不存在非Daemon线程时,会自动终止所有Daemon线程。
    3)Daemon线程中的finally块不一定会执行。
    4) Daemon线程中开启的线程也是Daemon线程。因为:当前线程就是该线程的父线程,而该线程的daemon属性和priority属性默认为父线程的对应属性。

    一个线程对象是由其parent线程进行空间分配,并且child线程继承了parent的daemon、priority、加载资源的contextClassLoader、ThreadLocal。

    中断

    1)其它线程通过调用该线程的interrupt()方法对其进行中断。
    2)如果该线程已经结束,即使该线程被中断过,那么调用其interrupt()时返回false。
    3)许多在声明抛出InterruptedException的方法,如:sleep,在抛出InterruptedException之前,Java虚拟机会先将该线程的中断标识清除。
    4)中断状态是线程的一个标识位,可以用来取消或终止任务。终止时可以去清理资源。

    @Override
    public void run() {
      while( ! Thread.currentThread().isInterrupted() ) { // 也可以自己定义一个flag
        ++i;
      }
    }
    
    suspend stop resume弃用

    suspend()调用后,线程不会释放已经占有的资源,如:锁。而是占有着资源进入睡眠状态,容易引起死锁。stop()方法在终结一个线程时不会保证线程的资源正常释放,导致程序可能工作在不确定状态。

    join

    thread.join() 和 thread.join(long millis)
    当thread线程执行完毕或等待millis时间后,才会继续执行当前线程。

    相关文章

      网友评论

          本文标题:BiBi - 并发编程 -8- 线程

          本文链接:https://www.haomeiwen.com/subject/cofxlqtx.html