創(chuàng)建線程
new Thread(?).start() ?可以是2種。
- runable接口的實現(xiàn)類 也可以繼承Thread類
會執(zhí)行對應(yīng)的run方法 - new Future(callable接口的實現(xiàn)類)
之后.get()才會真正執(zhí)行 callable中的call方法
這兩種有啥區(qū)別
處理異常方式不同键痛。
一個是有返回值,一個沒有返回值例衍。
對應(yīng)線程池execute
和submit
方法降宅。
一個是start就開始運行,一個是get開始挎扰。
線程處理異常翠订?
https://www.cnblogs.com/wang-meng/p/10639914.html
- 繼承Thread 或者runnable可用
thread.setUncaughtExceptionHandler(new ExceptionHandler());
class ExceptionHandler implements UncaughtExceptionHandler
重寫 uncaughtException
來處理發(fā)生的異常 拋出或者不拋出
- callable的線程
CallableTask callableTask1 = new CallableTask();
FutureTask ft = new MyFutureTask(callableTask1);
new Thread(ft).start();
System.out.println(ft.get());
發(fā)生異常 是get 來拋出的 所以可以 try get()
線程狀態(tài)
http://www.reibang.com/p/da90ab7bc79b
表頭 | 表頭 |
---|---|
NEW | new thread |
RUNNABLE | start() |
BLOCKED(不響應(yīng)中斷) | s鎖,wait |
WAITING | wait(notify notifyAll)遵倦,join 尽超,LockSupport.park |
TIMED_WAITING | wait,join(timeout) 梧躺,LockSupport.park(timeout) 似谁,sleep |
TERMINATED |
不常用方法
JDK 1.0
本來有一些像stop(), suspend() ,resume()
的控制方法但是由于潛在的死鎖威脅因此在后續(xù)的JDK版本中他們被棄用了掠哥。
https://my.oschina.net/javaroad/blog/2878517
yield
讓出自己的cpu資源 重新分配 但是結(jié)果不一定巩踏。
setPriority
會設(shè)置概率 但是不能保證。
Java中如何停止一個線程续搀?
- 當run() 或者 call() 方法執(zhí)行完的時候線程會自動結(jié)束塞琼。
- 當運行中出現(xiàn)了異常會停止運行。
- 設(shè)置中斷(waiting和timed_waiting可以相應(yīng))
interrupt相關(guān)的方法
- private native boolean isInterrupted(boolean ClearInterrupted);
這個方法來判斷 線程是否是中斷的狀態(tài) 而且支持清除中斷狀態(tài) - public void interrupt()
這個方法是來設(shè)置 線程為中斷狀態(tài)
中斷響應(yīng)
http://www.reibang.com/p/f75b77bdf389
我們設(shè)置了 線程的中斷狀態(tài) 那線程就會中斷么禁舷?
- runnable
if (Thread.interrupted()) throw new InterruptedException(); - blocked waiting timed waiting
- s鎖 不可中斷
- wait 可以
- join 可以
- sleep 可以
- 并發(fā)包里的lock 可以
- web socked 普通的accept不可以 nio的可以