面经集合


Java线程

[TOC]

4.  Java线程

4.1. 

4.1.1.  线程的状态

1.  就操作系统层面来说,线程状态有五种:

● 新建状态new:创建一个新线程

● 就绪状态ready:启动该线程,此时可以CPU调度

● 运行状态running:此时CPU调用其并执行其任务

● 等待状态waiting:因为sleep、join等方法无法继续执行,但还没执行完,就进入等待状态

● 结束状态terminated:任务执行完毕,线程结束

2.  就Java层面来说状态有六种:

● 新建状态NEW:创建一个新线程

● 就绪/运行状态RUNNABLE:启动线程后进入可运行状态,此时可能正在被执行,可能不在执行中

● 阻塞状态BLOCKED:一般拿锁失败会进入阻塞状态,等待锁的释放

● 等待状态WAITING:可能是挂起线程池、wait方法、awiat方法等,需要手动唤醒

● 时间等待状态TIMED_WAITING:可能是sleep方法、join方法等,不需要手动唤醒

● 结束状态TERMINATED:线程执行完毕

// new:public static void main(String[] args) throws InterruptedException{    Thread t1 = new Thread(() => {    });    System.out.println(t1.getState());}// runnable:public static void main(String[] args) throws InterruptedException{    Thread t1 = new Thread(() => {    while(true){}    });    t1.start();    Thread.sleep(500);    System.out.println(t1.getState());}// blocked:public static void main(String[] args) throws InterruptedException{    Object obj = new Object();    Thread t1 = new Thread(() => {        synchronized(obj){}    });    //main线程拿到了锁    synchronized(obj){        t1.start();        Thread.sleep(500);        System.out.println(t1.getState());    }}// waiting:public static void main(String[] args) throws InterruptedException{    Object obj = new Object();    Thread t1 = new Thread(() => {        synchronized(obj){            try{                obj.wait();            } catch (InterruptedException e){                e.printStackTrace();            }        }    });    t1.start();    Thread.sleep(500);    System.out.println(t1.getState());}// timed_waiting:public static void main(String[] args) throws InterruptedException{    Thread t1 = new Thread(() => {        try{            Thread.sleep(1000);        } catch (InterruputedException e){            e.printStackTrace();        }    });    t1.start();    Thread.sleep(500);    System.out.println(t1.getState());}// terminated:public static void main(String[] args) throws InterruptedException{    Thread t1 = new Thread(() => {        try{            Thread.sleep(500);        } catch (InterruputedException e){            e.printStackTrace();        }    });    t1.start();    Thread.sleep(1000);    System.out.println(t1.getState());}

4.1.2.  线程的实现方式

4.1.3.  线程和进程的区别

4.1.4.  守护线程和本地线程的区别

4.1.5.  死锁和活锁的区别

4.1.6.  死锁和饥饿的区别

4.1.7.  线程组

4.1.8.  原子操作,原子类

4.1.9.  阻塞队列 实现原理

4.1.10.  如何用阻塞队列实现生产者-消费者模型

4.1.11.  futuretask

4.1.12.  callable

4.1.13.  并发容器

4.1.14.  多线程同步和互斥的实现方法

4.1.15.  什么是竞争条件

4.1.16.  调用start会执行run,为什么不直接调用run

4.1.17.  唤醒阻塞线程

4.1.18.  线程调度算法

4.1.19.  线程组

4.1.20.  停止正在运行的线程

4.1.21.  多线程之间的通讯和协作

4.1.22.  可重入锁

4.1.23.  乐观锁、悲观锁

4.1.24.  线程安全

4.1.25.  wait和sleep的不同

4.1.26.  线程发生异常时会怎样

4.1.27.  如何检查线程是否有锁

4.1.28.  如何让正在运行的线程暂停一段时间

4.1.29.  线程优先级

4.1.30.  线程调度器、时间分片

4.1.31.  w

页面列表

ITEM_HTML