如何停止线程
- stop方法有其固有的不安全性,一般不使用。
而是使用的Thread类中提供的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。
如何控制线程的结束?
通过结束线程任务的循环就可以结束线程思路:- - ->定义标记
但是会发现,如果线程处于了冻结状态,无法读取标记。
– - ->:强制读取标记
可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备cpu的执行资格。
强制动作会发生了InterruptedException,如果不处理则恢复的线程继续向下执行,同样不能解决问题,所以一定要处理
应该在异常catch里强制终止,把标记赋值false
*/
class Interrupt implements Runnable
{
private boolean flag = true;
public synchronized void run()
{
while (flag)
{
try
{
wait();//如果线程等待后被唤醒,将从这开始继续向下执行,不会判断标记
}
catch (InterruptedException ex)
{System.out.println(Thread.currentThread().getName()+"exception...");}
System.out.println(Thread.currentThread().getName()+"run.........");
}
}
void setFlag(boolean flag)
{
this.flag = flag;
}
}
class StopThread
{
public static void main(String[] args)
{
Interrupt in = new Interrupt();
Thread t1 = new Thread(in);
Thread t2 = new Thread(in);
t1.start();
t2.setDaemon(true);
t2.start();
int count = 0;
//t1,用于演示interrupt,t2用于演示setDaemon
while(true)
{
if(count++==20)
{
in.setFlag(false);
t1.interrupt();
break;
}
System.out.println(Thread.currentThread().getName()+"主进程run"+count);
}
System.out.println("main 结束");
}
}
Thread中其他方法
- setDaemon
public final void setDaemon(boolean
on)将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。该方法首先调用该线程的 checkAccess 方法,且不带任何参数。
这可能抛出 SecurityException(在当前线程中)。
简单的说,就是前台线程如果都结束了,守护线程(后台线程/联合线程)就自动结束
- join
public final void join()
throws InterruptedException等待该线程终止。
用于临时申请加入线程执行,那么当前运行的线程等待此线程结束才有CPU执行资格
setPriority(int newPriority)
更改线程的优先级。
t1.setsetPriority(Thread.MAX_MAX_PRIORITY),只是表示优先级最大,获取CPU执行权的几率越大,并不一定最先执行。
toString()
返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
yield()
暂停当前正在执行的线程对象,并执行其他线程。