第一章 快速认识线程

1.1 线程的介绍

对计算机来说,一个任务就是一个进程(Process),每个进程至少要有一个线程(Thread),有时线程也称轻量级的进程。

1.2 快速创建并启动一个线程

import java.util.concurrent.TimeUnit;

public class TryConcurrency {

    public static void main(String[] args) {
        browseNews();
        enjoyMusic();
    }
    
    private static void browseNews() {
        for (;;) {
            System.out.println("------browseNews-----");
            sleep(1);
        }
    }
    
    private static void enjoyMusic() {
        for (;;) {
            System.out.println("------enjoyMusic------");
            sleep(1);
        }
    }

    private static void sleep(int seconds) {
        try {
            TimeUnit.SECONDS.sleep(seconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

此代码永远不会输出------enjoyMusic------,因为第一个方法无限循环。

1.2.2 并发运行交替输出

需要用Thread类,实现此效果

public static void main(String[] args) {
    new Thread() {
        @Override
        public void run() {
            enjoyMusic();
        }
    };
    browseNews();
    // Java8 Lambda
    new Thread(TryConcurrency::enjoyMusic).start();
}

1.3 线程的生命周期详解

1. NEW
Thread t = new Thread();  // 仅仅一个t对象,没开启一个线程
2. RUNNABLE
t.start();   // 开启线程,但并不是马上执行。要看CPU心情,好吧,叫调度执行权
3. RUNNING
  • to TERMINATED:
t.stop();  // (已废弃,但可用)
  • to BLOCKED:
// 1
t.sleep();  // 睡眠
// 2
t.wait();  // 进入waitSet 等待
// 3
进行阻塞的IO操作
// 4
获取资源锁,加入到该锁的阻塞队列
  • to RUNNABLE
// 1
t.yield();  // 放弃
// 2
CPU心情不好,^_^,调度轮询使该线程放弃执行
4. BLOCKED
  • to TERMINATED:
t.stop();  // (已废弃,但可用)
  • to RUNNABLE
// 1
线程完成了指定的休眠时间
// 2 wait中的线程使用了
t.notify();
t.notifyall();
// 3 
线程阻塞的操作完成
// 4 
获取到了某个锁资源
// 5 
线程在阻塞过程中被打断,其他线程调用了interrupt()方法。
5.TERMINATED
  • 正常运行结束
  • 线程运行出错意外结束
  • JVM Crash,导致所有的线程结束

14 线程的start方法剖析:模板设计模式在Thread中的应用

1.4.1 Thread start方法的源码分析以及注意事项
public synchronized void start() {
    if (threadStatus != 0) {
        throw new IllegalThreadStatusEception();
    }
    group.add(this);
    boolean started = false;
    try {
        start0();
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
        }
    }
}

你可能感兴趣的:(第一章 快速认识线程)