《Java多线程编程核心技术_高洪岩 著》读后整理01

2017-05-17  本文已影响0人  Jthan

写在前面:零零散散地花了不少时间在这本书上,看到第四章的时候实在是有些坚持不下去,但出于对作者的尊重还是硬着头皮在昨天晚上拜读完了,看完的感想就简单几个字‘我从未见过如此****之人和出版社’,不知为什么会有人推荐这本书估计多半是出版社的广告帖。

毕竟花了不少时间在这上边,得对时间负责,在此整理于2017年5月16日。

注意:若有幸被他人查阅,请以辩证的眼光对待,若有问题不必在此指出。

第1章 Java多线程技能


概念

mythread.start();//代码肉眼看到的前后顺序不代码线程的启动顺序


* 构造函数Thread(Runnable target)不光可以传入Runable接口的对象,还可以传入一个Thread类的对象,还可以传入一个Thread类的对象,这样做完全可以将一个Thread对象中的run()方法交由其他的线程进行调用。

* 自定义线程类中的实例变量针对其它线程可以有共享与不共享之分,这在多个线程之间进行交互时是很重要的一个技术点。

* 在某些JVM中,i--的操作要分成如下3步:

* ```
1)取得原有i值。
2)计算i-1。
3)对i进行赋值

基本方法

Thread.currentThread().getName();//线程名


* run()方法是自动调用的方法。

* isAlive()方法是判断当前的线程是否处于活动状态。活动状态就是线程已经启动且尚未终止。线程处于正在运行或准备开始运行的状态,就认为线程是“存活”的。

* ```
mythread.isAlive();//是否为活动状态

Thread.sleep(1000);//throws InterruptedException


* getId()方法的作用是取得线程的唯一标识。

* ```
Thread.currentThread().getId();//获取线程id值,long类型

Thread.yiled();//native方法


* 在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先级较高的线程对象中的任务。高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行,线程的优先级具有一定的规则性,也就是CPU***尽量***将执行资源让给优先级较高的线程。不要把线程的优先级与运行结果的顺序作为衡量的标准,优先级较高的线程不一定每一次都先执行完run()方法中的任务,也就是说,线程优先级与打印顺序无关,不要将这两者的关系相关联,它们的关系具有不确定性和随机性。

* ```
mythread.getPriority();//获得优先级
mythread.setPriority(MAX_PRIORITY);//设置优先级
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;

停止线程

* 停止线程:异常法

* ```
    @Override
    public void run() {
        if (this.interrupter()){//主线程
            //TODO 业务逻辑
            thorw new InterrupterException();
        }
    }

---

##### 守护线程

* 守护线程是一种特殊的线程,它的特性有陪伴的含义,当进程中不存在非守护线程了,则守护线程自动销毁。

* 典型的守护线程就是垃圾回收线程,当进程中不存在非守护线程了,则垃圾回收线程也就没有存在的必要了,自动销毁。

* 守护线程的作用是为其他线程的运行提供便利服务,最典型的应用就是GC,它就是一个很称职的守护者。

* ```
    //Thread 类
    public class MyThread extends Thread {
        private int i = 0;
        
        @Override
        public void run() {
            try {
                while (true) {
                    i++;
                    System.out.println("i=" + i);
                    Thread.sleep(1000);
                }
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    //测试类
    public class Test {
        public static void main(String[] args) {
            try {
                MyThread mt = new MyThread();
                mt.setDaemon(true);//把mt这个线程设置为守护线程
                mt.start();
                Thread.sleep(5000);
                /*
                 *‘最后一行代码’执行完后此例中并没有其它非守护线程,
                 *所以mt做为守护线程的任务也跟着结束了
                 */
                System.out.println("此例中的所有线程结束");
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
上一篇下一篇

猜你喜欢

热点阅读