如何结束线程-线程中断

停止现成的方式

线程停止的方式:

  • 线程执行完毕,自然会停止
  • 异常退出
  • 设置了标志位,当标志位为false时退出
  • 线程中断退出
    (这也是一道常见面试题)

线程函数执行完毕正常退出和发生异常被迫退出都不受我们控制,下面讨论控制线程停止的方式。

设置退出标志位

package com.sync.demo;

import javax.swing.text.html.HTML.Tag;

public class Demo5 {

	public static void main(String[] args) {
		ThreadC c = new ThreadC();
		Thread thread = new Thread(c);
		thread.start();
		try {
			Thread.sleep(3000);
			c.setTag(false);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}
	
	static class ThreadC implements Runnable{
		
		private boolean Tag = true;
		
		
		public boolean isTag() {
			return Tag;
		}

		public void setTag(boolean tag) {
			Tag = tag;
		}

		public ThreadC() {
			super();
		}

		@Override
		public void run() {
			while (true) {
				if (!Tag) {
					System.out.println("=========退出============");
					return ;
				}else {
					System.out.println("=========run============");
				}	
			}
		}
	}

}

线程中断

java提供了线程中断机制,可以利用线程中断机制来结束线程,运行过程中检查线程是否被中断或者捕获InterruptedException异常。
判断中断的两种方式:
Thread.interrupted(); 可以设置中断的值为false
isInterrupted()

检查中断:

public class Demo5 {

	public static void main(String[] args) {
		ThreadD threadD = new ThreadD();
		threadD.start();
		try {
			Thread.sleep(3000);
			threadD.interrupt();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}
	
	static class ThreadD extends Thread{

		public ThreadD() {
			super();
		}

		@Override
		public void run() {
			while (true) {
				if (isInterrupted()) {
					System.out.println("=========退出============");
					return ;
				}else {
					System.out.println("=========run============");
				}	
			}
		}
	}
	}

利用捕获中断停止线程:

public class Demo5 {

	public static void main(String[] args) {
		ThreadE threadE = new ThreadE();
		threadE.start();
		try {
			Thread.sleep(3000);
			threadE.interrupt();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

	static class ThreadE extends Thread {

		public ThreadE() {
			super();
		}

		@Override
		public void run() {
			try {
				test1();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

		private void test1() throws InterruptedException {
			while (true) {
				if (!isInterrupted()) {
					System.out.println("=========run============");
				} else {
					throw new InterruptedException();
				}
			}

		}

	}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章