Java---21---停止线程

停止线程

本来Thread类中有一个stop方法可以用来停止线程,但是却过时了,那么又该怎样停止线程呢?

线程运行其实运行的是run方法中的代码,那么只要将run方法停止,那么线程也就随之停止了。

一般线程的运行与循环相结合,那就好办了。将标记修改,那么run方法就会结束。

class StopThread implements Runnable {
	private boolean flag = true;

	public void run() {
		while (flag) {
			System.out.println(Thread.currentThread().getName() + "-----");
		}

	}

	public void changeFlag() {
		flag = false;
	}
}

public class Stop {
	public static void main(String[] args) {
		int num = 0;
		StopThread s = new StopThread();
		Thread t1 = new Thread(s);
		Thread t2 = new Thread(s);

		t1.start();
		t2.start();

		while (true) {
			if (num++ == 60) {
				s.changeFlag();
				break;

			}
			System.out.println("main");
		}
	}

}

但是此方法却不适用于处于冻结状态。

当线程处于冻结状态的时候不会读取到标记,当然不会结束。

当没有指定的方式让冻结的线程恢复到运行状态时,需要对冻结进行清除,强制让线程恢复到运行状态下,这样就可以改变标记,从而让线程结束。

线程在同步中冻结了有怎么结束?Interrupt

API:

interrupt

public void interrupt()

中断线程。

如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess 方法就会被调用,这可能抛出 SecurityException。

如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。

如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。

如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。

如果以前的条件都没有保存,则该线程的中断状态将被设置。

中断一个不处于活动状态的线程不需要任何作用。

抛出:

SecurityException - 如果当前线程无法修改该线程

class StopThread implements Runnable {
	private boolean flag = true;

	public synchronized void run() {
		while (flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				// e.printStackTrace();
				System.out.println("Exception");
			}
			System.out.println(Thread.currentThread().getName() + "-----");
		}

	}

	public void changeFlag() {
		flag = false;
	}
}

public class Stop {
	public static void main(String[] args) {
		int num = 0;
		StopThread s = new StopThread();
		Thread t1 = new Thread(s);
		Thread t2 = new Thread(s);

		t1.start();
		t2.start();

		while (true) {
			if (num++ == 60) {
				// s.changeFlag ();
				t1.interrupt();
				t2.interrupt();
				break;

			}
			System.out.println("main");
		}
	}

}

通过调用interrupt方法,这时线程已经从冻结状态恢复到了运行状态,但是只运行了一次。

使用interrupt会抛出异常,在异常抛出的同时,改变状态,就可以让线程停止。

class StopThread implements Runnable {
	private boolean flag = true;

	public synchronized void run() {
		while (flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				// e.printStackTrace();
				System.out.println("Exception");
				flag = false;
			}
			System.out.println(Thread.currentThread().getName() + "-----");
		}

	}

	public void changeFlag() {
		flag = false;
	}
}

public class Stop {
	public static void main(String[] args) {
		int num = 0;
		StopThread s = new StopThread();
		Thread t1 = new Thread(s);
		Thread t2 = new Thread(s);

		t1.start();
		t2.start();

		while (true) {
			if (num++ == 60) {
				// s.changeFlag ();
				t1.interrupt();
				t2.interrupt();
				break;

			}
			System.out.println("main");
		}
	}

}
时间: 2024-10-25 12:20:31

Java---21---停止线程的相关文章

Java中停止线程执行的方法

Java中停止线程执行的方法 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.暂停或停止线程的理论 在Java编程中,要暂停或停止当前正在运行的线程,有几种方法.对于把线程转入睡眠Sleep状态,使用Thread.sleep()是最正确的方式.或许有人会问,为什么不使用等待wait()或通知notify()?要知道,使用等待或通知都不是很好的方式. 线程可以使用等待wait()实现被阻塞,这属于条件等待的方式,当条件满足后,又会从阻塞转为等待状态

java多线程---停止线程

@Deprecated public final void stop() jdk源码中Thread的stop()方法已经被弃用了.那么怎么停止线程的呢? thread.interrupt();这就是需要用到的方法 一般建议使用抛异常的方法来实现停止线程.因为在catch块里可对异常信息进行相关处理. 如下: public class StopThread extends Thread{ /** * 停止一个线程可用Thread.stop(),但这个方法是不安全的,被弃用的.别用 * 还可以用Th

转: Java安全停止线程方法

转: http://blog.csdn.net/flyingpig4/article/details/7675557 1.早期Java提供java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume().,Sun公司的一篇文章<Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? > 2.

java多线程之停止线程

在多线程开发中停止线程是很重要的技术点.停止线程在Java语言中并不像break语句那样干脆,需要一些技巧性的处理. 一.  异常法 采用异常法来停止一个线程,首先我们需要了解一下两个方法的用法: 1.interrupt()方法 public class MyThread extends Thread{ @Override public void run() { for (int i = 1; i <= 10000; i++) { System.out.println("i="+

java线程之停止线程

     在Java中有以下3种方法可以终止一个正在运行的线程:      1.使用退出标志,是线程正常退出,也就是run方法完成后线程终止.      2.使用stop方法强制终止线程,蛋不推荐使用这个方法,因为stop.suspend和resume一样,都是作废过期的方法.      3.使用interrupt方法中断线程,大多数停止一个线程使用Thread.interrupt()方法,但是这个方法不会终止一个正在运行的线程,还需要加入一些判断才可以完成线程的停止. 下面我就用几个例子来介绍

二、java多线程编程核心技术之(笔记)——如何停止线程?

1.异常法 public class MyThread extends Thread { @Override public void run() { super.run(); try { for (int i = 0; i < 5000000; i++) { if(this.interrupted()){ System.out.println("我要停止了....."); throw new InterruptedException(); \\抛出异常 } System.out.

正确的停止java中的线程

stop()方法不是一个正确的停止线程方法. 正确的停止方法:设置退出旗标

JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题

重点掌握 /* * wait 和 sleep 区别? * 1.wait可以指定时间也可以不指定 * sleep必须指定时间 * 2.在同步中,对CPU的执行权和锁的处理不同 * wait释放执行权,释放锁    sleep释放执行权,不释放锁 */ //同步里具备执行资格的线程不止一个,但是能得到锁的只有一个,所以能执行的也只有一个 一.停止线程的方式 不可能让线程一直在运行,所以需要让线程停止 1.定义循环结束标记 一般而言,线程运行代码都是循环的,只要控制了循环就可以结束任务 2.使用int

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Java 多线程 自定义线程辅助

之前的文章我介绍了C#版本的多线程和自定义线程处理器. 接下来我们来看看Java版本的呢 java 的线程和C#的线程有点区别,java的线程没有是否是后台线程一说,具体原因是java的线程是jvm的c++代码模拟线程,而C#的线程也是C++模拟线程.但是区别在于C#的线程会基于系统的线程. C# 的 Thread.IsBackground; 这里唯一的区别在于,C#开启线程如果是非后台线程即便是你关闭了程序,如果不是强制退出进程的情况下.线程还会继续运行,知道垃圾回收机制强制回收.如果设置了后