Thread 和 Runnable 的区别
Thread 才是 Java 里对线程的唯一抽象,Runnable 只是对任务(业务逻辑)的抽象。
Thread 可以接受任意一个 Runnable 的实例并执行
启动线程的方式有:
1、X extends Thread;,然后 X.start
2、X implements Runnable;然后交给 Thread 运行
永远都只有thread.start才能启动线程。
线程的中断
安全的中止则是其他线程通过调用某个线程 A 的 interrupt()方法对其进行中断操作, 中断好比其他线程对该线程打了个招呼,“A,你要中断了”,不代表线程 A 会立即停止自己的工作,同样的 A 线程完全可以不理会这种中断请求。
因为 java 里的线程是协作式的,不是抢占式的。线程通过检查自身的中断标志位是否被置为 true 来进行响应,线程通过方法 isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()来进行判断当前线程是否被中断,不过 Thread.interrupted()会同时将中断标识位改写为 false。
如果一个线程处于了阻塞状态(如线程调用了 thread.sleep、thread.join、thread.wait 等),则在线程在检查中断标示时如果发现中断标示为 true,则会在这些阻塞方法调用处抛出 InterruptedException 异常,并且在抛出异常后会立即将线程的中断标示位清除,即重新设置为 false。
不建议自定义一个取消标志位来中止线程的运行。
注意:处于死锁状态的线程无法被中断
深入理解 run()和 start()
new 出 Thread 对象,该线程对象只是在就绪状态,还没有调用start方法启动线程,让cpu分配cpu时间进行执行。
start()方法让一个线程进入就绪队列等待分配 cpu,分到 cpu 后才调用实现
的 run()方法,start()方法不能重复调用,如果重复调用会抛出异常。
而 run 方法是业务逻辑实现的地方,本质上和任意一个类的任意一个成员方
法并没有任何区别,可以重复执行,也可以被单独调用。
其他的线程相关方法
yield()方法,让出当前cpu的占有权
join()方法,指定一个线程加入到当前线程中,并执行结束后,再执行当前线程。