Java多线程核心技术阅读笔记(第一章)

Java多线程API基本使用

Posted by 刘知安 on 2019-11-01
文章目录
  1. 第1章 Java多线程技能
    1. 1.1 使用Java多线程的两种方式
    2. 1.2 实例变量与线程安全
    3. 1.3 停止线程
    4. 1.4 yield()方法
    5. 1.5 线程的优先级
    6. 1.6 守护线程(Daemon)

第1章 Java多线程技能

1.1 使用Java多线程的两种方式

  1. 自定义一个类Mythread继承Thread类,并重载run()方法,再新建一个该类对象即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MyThread extends Thread {
    @Override
    public void run() {
    super.run();
    System.out.println("I am a MyThread obj!");
    }
    public static void main(String[] args) {
    MyThread myThread = new MyThread();
    myThread.start();
    }
    }
  2. 自定义一个类实现Runnable接口,并实现run()方法。

    1
    2
    3
    4
    5
    6
    7
    8

    Thread anotherThread = new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("I am an anotherThread obj!");
    }
    });
    anotherThread.start();

    值得注意的是,Thread()类本身也实现了Runnable方法,也就是说,可以将一个Thread类的对象来构造一个新的Thread类对象。这样就可以将一个Thread类对象obj1的run()方法交给其他
    线程调用。

1.2 实例变量与线程安全

自定义线程类中的实例变量针对其他线程可以有共享不共享两种方式。

  • (1)各线程间不共享数据

    这种情况下的数据是线程安全的

  • (2)各线程间不共享数据

    这种情况下的数据是线程不安全的,需要考虑同步。

1.3 停止线程

停止一个线程有以下3种方法,准确的说,只有两种:

  • 1)使用退出标志,使得线程正常退出,然后被OS 终止掉。
  • 2)使用Thread.interrupt()中断一个线程
  • 3)!!! 一定不要用stop()方法

1.4 yield()方法

yield()方法的作用是主动放弃当前得到的CPU时间片。至于放弃当前CPU时间片后何时再次得到时间片,那是OS考虑的事情,可能马上得到,也可能过一会儿得到,也有可能永远都得不到了。

1.5 线程的优先级

可以通过线程对象的setPriority()方法设置线程的优先级,分别有以下3个常量 (Thread类静态常量):

  • public final static int MIN_PRIORITY=1;
  • public final static int NORM_PRIORITY=5;
  • public final static int MAX_PRIORITY=10;

线程的优先级具有继承性,比如在A线程中新开了线程B,则线程B的优先级和A一样。

1.6 守护线程(Daemon)

通过线程对象的setDaemon()方法将一个线程设置为守护线程,当仅剩余守护线程时,守护线程将被kill掉。