读书笔记——《Java多线程编程核心技术》第一章

高考前别人都在努力的复习,我在看教材。看着目录想着每一个对应的标题下,对应的考试大纲,再联系自己做过的该条目的考察套路。虽然最后成绩也一般,但是过得很轻松,性价比很高。看到这本书,代码多于枯燥的理论,所以拿过来,将以往不管是项目还是学习中遇到的问题回顾下,就当看教科书。

常用方法

  1. currentThread()

返回代码段正在被哪个线程执行。

  1. isAlive()
    判断当前线程的状态。

  2. sleep()
    线程沉睡一段时间。

  3. getId()
    得到线程的Id。

  4. yield()
    让出CPU执行权,重新分配时间片。放弃的时间不确定,有可能刚刚放弃,马上又获取CPU时间片。

  5. isInterrupted()
    判断测试线程是否已经停止,不清除状态标记。

  6. interrupted()
    测试当前线程是否已经是中断状态,之后后具有将该状态标志置清除为false的功能。

    public static void main(String[] args) {

    Thread.currentThread().interrupt();
    System.out.println("是否停止1? ="+Thread.interrupted());
    System.out.println("是否停止2? ="+Thread.interrupted());
    System.out.println("end!");
    

    }

Output

是否停止1? =true
是否停止2? =false
end!

停止线程的方式

  1. interrupted + break退出线程

    public class MyThread5 extends Thread {

    @Override
    public void run(){
        super.run();
        for(int i = 0;i < 500000; i++){
            if(this.interrupted()){
                System.out.println("已经是停止状态了!我要退出了!");
                break;
            }
            System.out.println("i=" + (i + 1));
        }
    }
    

    }

弊端:如果循环外面还有要执行的语句,此方法会失效。

  1. interrupted + return退出线程

可以停止线程,不推荐。

  1. interrupted + throw new InterruptedException

推荐停止线程的方法,此种方法停止线程上层可以捕获到异常,使得线程停止的事件可以传播。

  1. stop

stop会停止线程,但是这是一个废弃的方法。会抛出ThreadDeath异常。

弊端:会产生不可预料的结果,比如锁的释放不当,导致数据不统一问题。

暂停线程

suspend与resume方法,一个是暂停线程,一个是恢复执行线程。
问题1:造成独占现象,使得其他线程无法访问公共同步对象。

问题2:造成数据不同步。

优先级

线程的优先级有助于“线程规划器”确定在下一次选择哪一个线程来优先执行。
线程优先级具有继承特性:A启动B线程,则A与B的优先级是相同的。

守护线程

setDaemon()方法可以设置是否为守护线程。当进程中不存在非守护线程时,守护线程也就自动销毁了(典型的守护线程:垃圾回收线程)。