创建线程
new Thread(?).start() ?可以是2种。
- runable接口的实现类 也可以继承Thread类
会执行对应的run方法 - new Future(callable接口的实现类)
之后.get()才会真正执行 callable中的call方法
这两种有啥区别
处理异常方式不同。
一个是有返回值,一个没有返回值。
对应线程池execute
和submit
方法。
一个是start就开始运行,一个是get开始。
线程处理异常?
https://www.cnblogs.com/wang-meng/p/10639914.html
- 继承Thread 或者runnable可用
thread.setUncaughtExceptionHandler(new ExceptionHandler());
class ExceptionHandler implements UncaughtExceptionHandler
重写 uncaughtException
来处理发生的异常 抛出或者不抛出
- callable的线程
CallableTask callableTask1 = new CallableTask();
FutureTask ft = new MyFutureTask(callableTask1);
new Thread(ft).start();
System.out.println(ft.get());
发生异常 是get 来抛出的 所以可以 try get()
线程状态
http://08643.cn/p/da90ab7bc79b
表头 | 表头 |
---|---|
NEW | new thread |
RUNNABLE | start() |
BLOCKED(不响应中断) | 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()
的控制方法但是由于潜在的死锁威胁因此在后续的JDK版本中他们被弃用了。
https://my.oschina.net/javaroad/blog/2878517
yield
让出自己的cpu资源 重新分配 但是结果不一定。
setPriority
会设置概率 但是不能保证。
Java中如何停止一个线程?
- 当run() 或者 call() 方法执行完的时候线程会自动结束。
- 当运行中出现了异?;嵬V乖诵小?/li>
- 设置中断(waiting和timed_waiting可以相应)
interrupt相关的方法
- private native boolean isInterrupted(boolean ClearInterrupted);
这个方法来判断 线程是否是中断的状态 而且支持清除中断状态 - public void interrupt()
这个方法是来设置 线程为中断状态
中断响应
http://08643.cn/p/f75b77bdf389
我们设置了 线程的中断状态 那线程就会中断么?
- runnable
if (Thread.interrupted()) throw new InterruptedException(); - blocked waiting timed waiting
- s锁 不可中断
- wait 可以
- join 可以
- sleep 可以
- 并发包里的lock 可以
- web socked 普通的accept不可以 nio的可以