一、线程生命周期(状态)

WPS图片打印_wps_doc_0(1).png

二、线程死亡(DEAD)
线程会以下面三种方式结束,结束后就是死亡状态。
正常结束

1. run()或 call()方法执行完成,线程正常结束。

异常结束

2. 线程抛出一个未捕获的 Exception 或 Error。

调用 stop

3. 直接调用该线程的 stop()方法来结束该线程—该方法通常容易导致死锁,不推荐使用。

三、JAVA 线程实现/创建方式

  1. 继承 Thread 类
  2. 实现 Runnable 接口。
  3. ExecutorService、Callable<Class>、Future 有返回值线程
  4. 基于线程池的方式
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {

     return new ScheduledThreadPoolExecutor(corePoolSize);

    }

    public static ExecutorService newFixedThreadPool(int nThreads) {

     return new ThreadPoolExecutor(nThreads, nThreads,
             0L, TimeUnit.MILLISECONDS,
             new LinkedBlockingQueue<Runnable>());

    }
    public static ExecutorService newCachedThreadPool() {

     return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
             60L, TimeUnit.SECONDS,
             new SynchronousQueue<Runnable>());

    }

    public static ExecutorService newSingleThreadExecutor() {

     return  new ThreadPoolExecutor(1, 1,
                     0L, TimeUnit.MILLISECONDS,
                     new LinkedBlockingQueue<Runnable>());

    }
    四、sleep 与 wait 区别

  5. 对于 sleep()方法,我们首先要知道该方法是属于 Thread 类中的。而 wait()方法,则是属于
    Object 类中的。线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等。
  6. sleep()方法导致了程序暂停执行指定的时间,让出 cpu 该其他线程,但是他的监控状态依然
    保持者,当指定的时间到了又会自动恢复运行状态。
  7. 在调用 sleep()方法的过程中,线程不会释放对象锁。
  8. 而当调用 wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此
    对象调用 notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
    五、start 与 run 区别
  9. start()方法来启动线程,真正实现了多线程运行。这时无需等待 run 方法体代码执行完毕,
    可以直接继续执行下面的代码。
  10. 通过调用 Thread 类的 start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运
    行。
  11. 方法 run()称为线程体,它包含了要执行的这个线程的内容,线程就进入了运行状态,开始运
    行 run 函数当中的代码。 Run 方法运行结束, 此线程终止。然后 CPU 再调度其它线程。

高旭
40 声望3 粉丝