线程-线程基础

创建线程

new Thread(?).start() ?可以是2种。

  1. runable接口的实现类 也可以继承Thread类
    会执行对应的run方法
  2. new Future(callable接口的实现类)
    之后.get()才会真正执行 callable中的call方法

这两种有啥区别
处理异常方式不同。
一个是有返回值,一个没有返回值。
对应线程池executesubmit方法。
一个是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()

线程状态
https://www.jianshu.com/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中如何停止一个线程?
  1. 当run() 或者 call() 方法执行完的时候线程会自动结束。
  2. 当运行中出现了异常会停止运行。
  3. 设置中断(waiting和timed_waiting可以相应)
interrupt相关的方法
  • private native boolean isInterrupted(boolean ClearInterrupted);
    这个方法来判断 线程是否是中断的状态 而且支持清除中断状态
  • public void interrupt()
    这个方法是来设置 线程为中断状态
中断响应

https://www.jianshu.com/p/f75b77bdf389
我们设置了 线程的中断状态 那线程就会中断么?

  • runnable
    if (Thread.interrupted()) throw new InterruptedException();
  • blocked waiting timed waiting
  • s锁 不可中断
  • wait 可以
  • join 可以
  • sleep 可以
  • 并发包里的lock 可以
  • web socked 普通的accept不可以 nio的可以

你可能感兴趣的:(线程-线程基础)