JAVA多线程编程
1.启动一个线程。
继承Thread或者实现Runnable接口(在项目中最好不要这么使用,采用线程池的方式,因为线程不可控。数量太多会导致CPU持续的做上下文切换).线程启动,其实是JAVA中的Thread类调用了操作系统层面的新建线程方法,而run方法为一个回调方法。即启动一个线程只能通过Thread.start()启动。直接Thread.run()的话,只相当于执行了一个方法而已。并没有起到多线程的方式
2.停止线程:
因为线程在运行期间是不可控的。所以其实停止一个线程其实没有绝对安全的方法。只能在线程的run方法中增加停止操作,如增加自定义编写interruptShutdown 方法 如下声明的变量必须为 volatile 关键字修饰。
1private volatile static boolean shutDown = false;
2 public static void main(String[] args) {
3 new Thread(new Runnable() {
4 @Override
5 public void run() {
6 while(!shutDown) {
7 System.out.println(111);
8 }
9 }
10 }).start();
11 }
3.为什么所有涉及到阻塞的方法中,都要抛出InterruptedException异常??
目的是为了当某个线程处于阻塞状态时,系统调用thread.interrupt方法时,如果检测到当前线程处于阻塞状态,会直接抛出该异常。这样我们就能捕获该异常,进行线程的销毁。
线程的生命周期:(六种状态)

NEW:线程实例化时,还未调用Thead.start();
RUNNING:调用了Thread.start()方法,这里又分为两个状态,即READY(就绪)和RUNNING。因为调用了start方法时,并没有真正意义上的执行,需要等待CPU轮寻到该线程时才能执行
WAITING:等待阶段即调用了join();wait();方法时,会变为等待状态。此时线程不会被CPU调用到,即不会占用CPU资源。但是需要等待唤醒,如果没有唤醒的话,则会处于一直等待的状态
WAITING_TIME:有时间超时的等待,即超过该时间没有被唤醒的话,则会自动唤醒。
BLOCKED:阻塞状态,即线程未获取到锁,如在方法上面加了synchronized,而上一个线程已经获取到了锁,则当前线程处于阻塞状态,需要轮寻去获取锁,此时会消耗CPU资源
TERMINATED:线程消亡,即抛出异常或者被终止。或者执行完了run方法。此时线程会终止
本次课程总结
一、线程的目的是为了增加在多核CPU上能够更好的运用CPU资源的一个方法,采用多线程,CPU的多个核心能够同时工作,最大化的利用CPU资源,而在单核CPU上面,最好不要使用多线程,因为此时并没有真正意义上的实现了多线程,只是CPU时间片轮寻而已。CPU还要进行线程的上下文切换,反而会加重CPU的负担。适得其反
编写线程
二、在编写线程时,最好增加停止线程的方法。因为线程在运行期间是不可控的,所以并没有真正意义上的安全停止线程的方法。这也解释了为什么Thread类中的destroy,stop,resume等方法已经过时,不推荐使用。但是可以考虑调用Thread.interrupt方法。该方法会设置线程的状态为停止状态(JDK底层实现),当线程中存在阻塞时,调用thread.interrupt方法时,会抛出异常,可在异常中处理终止线程的逻辑代码




