方式一:使用interrupt
public static void main(String[] args) { MyRunable myRunable = new MyRunable(); Thread thread = new Thread(myRunable); thread.start(); for (int i = 0;i < 50;i++){ System.out.println(Thread.currentThread().getName()+"-"+i); try { Thread.sleep(300); //线程休眠,会让出cpu时间片(让同一进程中其余线程占用cpu时间片) } catch (InterruptedException e) { e.printStackTrace(); } if(i == 20){ thread.interrupt(); //在自定义线程上打了一个中断标记 } } }
class MyRunable implements Runnable{ @Override public void run() { for (int i = 0;i< 50;i++){ if(Thread.interrupted()){ //interrupted方法会清除中断标记 break; } System.out.println(Thread.currentThread().getName()+"-"+i); try { Thread.sleep(300); //sleep方法也会清除中断标记并报错 } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); //在报错的地方继续添加中断标记在循环判断的时候会中断该循环 } } } }
方式二:使用中断标记(更常用,更好理解)
public static void main(String[] args) { MyRunable myRunable = new MyRunable(); Thread thread = new Thread(myRunable); thread.start(); for (int i = 0;i < 50;i++){ System.out.println(Thread.currentThread().getName()+"-"+i); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } if(i == 20){ myRunable.flag = false; } } }
class MyRunable implements Runnable{ public boolean flag = true; @Override public void run() { int i = 0; while (flag){ System.out.println(Thread.currentThread().getName()+"-"+(i++)); try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } } }