(一)设置终止标识
public class SysController extends Thread{
//volatile 锁
public volatile boolean exit = false;
@Override
public void run(){
while (!exit){
System.out.println(SysController.currentThread().getName()+"ThreadFlag线程退出");
}
}
//main 这个线程和上面的Thread-0 不能同时执行,线程执行都是并发执行,1先执行完后2在执行
public static void main(String[] args)throws Exception {
SysController sysController = new SysController();
sysController.start();
//主线程推迟3秒
sleep(3000);
//终止线程thread,这状态一改,上面的exit也改了,所以就停了
sysController.exit = true;
//main线程放弃cpu使用权
System.out.println(sysController.currentThread().getName()+"开始另一个线程执行!!!");
//等待run中的线程Thread-0 执行完后才能执行下面的东西
sysController.join();
// sysController.exit = true;
System.out.println(sysController.currentThread().getName()+"开始exit另一个线程执行!!!");//线程名main
System.out.println(SysController.currentThread().getName()+"开始exit另一个线程执行!!!");//线程名main
System.out.println("线程退出");
}
}
在上面的代码中定义一个退出标志exit,当exit为true时,while循环退出,exit的默认值为false。在定义exit时,使用一个Java关键字的目的是保证exit内存可见性,也就是说对exit的修改会立刻对其它线程可见(Run()中的exit会变)。
(二)设置线程中断,interrupt()方法。如果不设置interrupt()方法:
//volatile 锁
public volatile boolean exit = false;
@Override
public void run(){
while (!exit){
System.out.println(Thread.currentThread().getName()+" is Running");
try {
System.out.println(Thread.currentThread().getName()+" 前join()");
Thread.currentThread().join();
System.out.println(Thread.currentThread().getName()+" 后join()");
}catch (InterruptedException e){
System.out.println(Thread.currentThread().getName()+" Week up from bolck.....");
exit = true;
}
}
System.out.println(Thread.currentThread().getName()+" is exiting....");
}
//main 这个线程和上面的Thread-0 不能同时执行,线程执行都是并发执行,1先执行完后2在执行
public static void main(String[] args)throws Exception {
SysController sysController = new SysController();
System.out.println("Starting thread...");
sysController.start();
System.out.println("interrupt xc"+Thread.currentThread().getName());
Thread.sleep(3000);
System.out.println("SysController thread..."+Thread.currentThread().getName());
sysController.exit = true;
//不设置interrupt()
// sysController.interrupt();
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+" stop application....");
}
输出:
小红方块没有变黑(测试类run全跑完应该是变黑的),说明一个线程还是处于join()状态,只是另一个线程执行完剩下的程序
如果一个线程阻塞了,想让它阻塞结束:
1:Thread.join()。如果先join(),想让join()阻塞结束就可以用interrupt()终止阻塞。下面的一个意思
例如:
blic class SysController extends Thread{
//volatile 锁
public volatile boolean exit = false;
@Override
public void run(){
while (!exit){
System.out.println(Thread.currentThread().getName()+" is Running");
try {
System.out.println(Thread.currentThread().getName()+" 前join()");
Thread.currentThread().join();
System.out.println(Thread.currentThread().getName()+" 后join()");
}catch (InterruptedException e){
System.out.println(Thread.currentThread().getName()+" Week up from bolck.....");
exit = true;
}
}
System.out.println(Thread.currentThread().getName()+" is exiting....");
}
//main 这个线程和上面的Thread-0 不能同时执行,线程执行都是并发执行,1先执行完后2在执行
public static void main(String[] args)throws Exception {
SysController sysController = new SysController();
System.out.println("Starting thread...");
sysController.start();
System.out.println("interrupt xc"+Thread.currentThread().getName());
Thread.sleep(3000);
System.out.println("SysController thread..."+Thread.currentThread().getName());
//设置退出表示true
sysController.exit = true;
//设置中断
sysController.interrupt();
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName()+" stop application....");
}
}
输出:sysController.interrupt(); 设置
说明: 设置退出表示true
sysController.exit = true;
设置中断
sysController.interrupt();
可以中断join()的线程阻塞,主要是因为sysController.interrupt();触发InterruptedException异常从而中断join()。
2:Thread.sleep()
3:ServerSocket.accept()方法
4:Thread的interrupt()方法终止线程
5:当线程阻塞时,使线程处于不可运行状态时,即使主线程中将该线程的退出标识设为true,但是该线程此时根本无法检查循环标志,当然也就无法立即中断。
(三)废弃的方式(主要是为了面试的,废弃方式不能用):
1:
2:Thread.suspend
(1)使线程暂停
(2)不会释放类似锁这样的资源.
和Thread.suspend配对的还有Thread.resume:
3:Runtime.runFinalizersOnExit