多线程详解_1 - 你的雷哥 - 博客园 (cnblogs.com)
多线程详解_2 - 你的雷哥 - 博客园 (cnblogs.com)
线程池详解_3 - 你的雷哥 - 博客园 (cnblogs.com)
多线程
创建线程的三种方式
继承Thread类,实现Runnable类,实现Callable类。
实现Callable也是创建线程池的一种方法
函数式编程
只有一个函数的接口,lambda是实现函数式编程的一种实现,形式简单,代码易懂。
多线程几种常用方法
1. public static Thread currentThread()
返回目前正在执行的线程
2. public final String getName()
返回线程的名称
3. public final int getPriority()
返回线程的优先级
4. public final void setPriority(String name)
设定线程名称
5. public final boolean isAlive()
判断线程是否在活动,如果是,返回true,否则返回false
6. public final void join()
等待这个线程死亡。
即调用该方法的线程强制执行,其它线程处于阻塞状态,该线程执行完毕后,其它线程再执行。
7. public static void sleep(long millis)
使用当前正在执行的线程休眠millis秒,线程处于阻塞状态
8. public static void yield()
当前正在执行的线程暂停一次,允许其他线程执行,不阻塞,线程进入就绪状态,如果没有其他等待执行的线程(或者这个线程又抢先抢占到cpu资源),则这个时候当前线程就会马上恢复执行。
9. public final void stop()
强迫线程停止执行。已过时。不推荐使用
sleep和yield不会释放锁资源,wait和join会释放锁资源。
线程状态
Java线程的三种停止方法
一、阻塞中断和非阻塞中断
interrupt() 方法并不会立即执行中断操作,这个方法只会给线程设置一个为true的中断标志,遇到wait,join,sleep会抛出异常,把中断标注重置为false,可以和return结合结束线程。
设置之后,则根据线程当前的状态进行不同的后续操作。
(1)如果,线程的当前状态处于非阻塞状态,那么仅仅是线程的中断标志被修改为true而已(2)如果线程的当前状态处于阻塞状态,那么在将中断标志设置为true后,如果是 wait、sleep以及join 三个方法引起的阻塞,那么会将线程的中断标志重新设置为false,并抛出一个InterruptedException ,这样受阻线程就得以退出阻塞的状态。
举例:一个线程在运行状态中,其中断标志被设置为true之后,一旦线程调用了wait、join、sleep方法中的一种,立马抛出一个InterruptedException,且中断标志被程序会自动清除,重新设置为false
总结:调用线程类的interrupted方法,其本质只是设置该线程的中断标志,将中断标志设置为true,并根据线程状态决定是否抛出异常。
public class TestThread1 { public static void main(String[] args) { MyRunnable1 myRunnable=new MyRunnable1(); Thread thread=new Thread(myRunnable,"子线程"); thread.start(); try{ //主线程休眠 Thread.sleep(3000); //调用中断,true thread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } } class MyRunnable1 implements Runnable{ @Override public void run() { int i=0; while(true){ System.out.println(Thread.currentThread().getName()+"循环第"+ ++i+"次"); try{ //判断线程的中断情况 boolean interruptStatus=Thread.currentThread().isInterrupted(); System.out.println(Thread.currentThread().getName()+"循环第"+ ++i+"次"+interruptStatus); Thread.sleep(1000); //非阻塞中断 只是设置标记位true //非阻塞中断 只是设置标记位true if(interruptStatus){ //如果中断为true则退出 break; } } catch (InterruptedException e) { // 一个线程在运行状态中,其中断标志被设置为true之后,一旦线程调用了 // wait、join、sleep方法中的一种,立马抛出一个InterruptedException,且中断标志被程序会自动清除,重新设置为false System.out.println("阻塞中断"+Thread.currentThread().isInterrupted());//显示false并抛异常 return;//不想返回还可继续写代码 } } } } 子线程循环第1次false 子线程循环第2次false 子线程循环第3次false 阻塞中断false