1.7.3能停止的线程-异常法

测试如下

 1 package com.cky.thread;
 2
 3 /**
 4  * Created by edison on 2017/12/3.
 5  */
 6 public class MyThread12 extends Thread{
 7     @Override
 8     public void run() {
 9         super.run();
10         for (int i = 0; i < 50000; i++) {
11             if (Thread.interrupted()) {
12                 System.out.println("子线程已经停止了,我要退出");
13                 break;
14             }
15             System.out.println("i="+(i+1));
16         }
17         System.out.println("for循环后继续执行");
18     }
19 }
 1 package com.cky.test;
 2
 3 import com.cky.thread.MyThread12;
 4
 5 /**
 6  * Created by edison on 2017/11/27.
 7  */
 8 public class Test1 {
 9     public static void main(String[] args) {
10
11         try {
12             MyThread12 th = new MyThread12();
13             th.start();
14             Thread.sleep(20);
15             th.interrupt();
16         } catch (InterruptedException e) {
17             System.out.println("main catch");
18             e.printStackTrace();
19         }
20         System.out.println("main end");
21
22
23     }
24 }
1 i=1229
2 i=1230
3 i=1231
4 i=1232
5 i=1233
6 i=1234
7 子线程已经停止了,我要退出
8 for循环后继续执行
9 main end

结果分析,这时cpu切换到了主线程执行了interrupt函数,这时,再进入for循环,前面已经执行到了1234,这时打完标记的子线程已经中断了,这时break跳出当前的for循环,但是下面的for循环外的语句还是

会执行的,因为线程已经打了标记,但是线程并没有被立刻中断

那如何使线程被立刻中断呢?

可以用抛出异常的方法

 1 package com.cky.test;
 2
 3 import com.cky.thread.MyThread12;
 4
 5 /**
 6  * Created by edison on 2017/11/27.
 7  */
 8 public class Test1 {
 9     public static void main(String[] args) {
10
11         try {
12             MyThread12 th = new MyThread12();
13             th.start();
14             Thread.sleep(20);
15             th.interrupt();
16         } catch (InterruptedException e) {
17             System.out.println("main catch");
18             e.printStackTrace();
19         }
20         System.out.println("main end");
21
22
23     }
24 }
 1 package com.cky.thread;
 2
 3 /**
 4  * Created by edison on 2017/12/3.
 5  */
 6 public class MyThread12 extends Thread{
 7     @Override
 8     public void run() {
 9         super.run();
10         try {
11             for (int i = 0; i < 50000; i++) {
12                 if (Thread.interrupted()) {
13                     System.out.println("子线程已经停止了,我要退出");
14                     throw new InterruptedException();
15                 }
16                 System.out.println("i="+(i+1));
17             }
18             System.out.println("for循环后继续执行");
19         } catch (InterruptedException e) {
20             System.out.println("进run方法的catch了");
21             e.printStackTrace();
22         }
23     }
24 }
1 i=1293
2 i=1294
3 i=1295
4 i=1296
5 子线程已经停止了,我要退出
6 进run方法的catch了
7 main end
8 java.lang.InterruptedException
9     at com.cky.thread.MyThread12.run(MyThread12.java:14)
时间: 2024-08-30 18:16:33

1.7.3能停止的线程-异常法的相关文章

停止Java线程,小心interrupt()方法

程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误. 在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程. 背景     中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作.线程是死亡.还是等待新的任务或是继续运行至下一步,就取决于这个程序.虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果.你最好还是牢记以下的几点告诫. 首先,忘掉

Java并发(基础知识)—— 创建、运行以及停止一个线程

0.介绍 在计算机世界,当人们谈到并发时,它的意思是一系列的任务在计算机中同时执行.如果计算机有多个处理器或者多核处理器,那么这个同时性是真实发生的:如果计算机只有一个核心处理器那么就只是表面现象. 现代所有的操作系统都允许并发地执行任务.你可以在听音乐和浏览网页新闻的同时阅读邮件,我们说这种并发是进程级别的并发.而且在同一进程内,也会同时有多种任务,这些在同一进程内运行的并发任务称之为线程. 在这里我们要讨论的是线程级并发.Java提供了Thread类,使我们能够在一个Java进程中运行多个线

java停止一个线程

Thread类中有start(), stop()方法,不过stop方法已经被废弃掉. 平时其实也有用过,共享一个变量,相当于标志,不断检查标志,判断是否退出线程 如果有阻塞,需要使用Thread的interrupt()方中断阻塞,线程开始检查标志(PS:抛出异常不会退出循环) ------------------------------------------------------------我是copy分割线------------------------------------------

Java线程状态、线程停止、线程阻塞

线程状态(五种状态) Java 线程的生命周期包括创建,就绪,运行,阻塞,死亡5 个状态.一个 Java 线程总是处于这 5 个生命周期状态之一,并在一定条件下可以在不同状态之间进行转换 . 创建状态 (New Thread) 在 Java 语言中使用 new操作符创建一个线程后,该线程仅仅是一个空对象,它具备了线程的一些特征,但此时系统没有为其分配资源,这时的线程处于创建状态. 就绪状态 (Runnable) 使用 start()方法启动一个线程后,系统为该线程分配了除 CPU 外的所需资源,

如何停止JAVA线程

如何停止JAVA线程 如何停止java的线程一直是一个困恼我们开发多线程程序的一个问题.这个问题最终在Java5的java.util.concurrent中得到了回答:使用interrupt(),让线程在run方法中停止. 简介 在Java的多线程编程中,java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume().通过这些方法,我们可以对线程进行方便的操作,但是

c#.net的网站出现“正在中止线程””异常的原因和解决方法

出现“正在中止线程”异常通常都是由于以下三种原因导致引起,给出解决方案如下: 解决方案: 1.针对Response.End,调用 HttpContext.Current.ApplicationInstance.completeRequest() 方法而不是 Response.End 以跳过 Application_EndRequest 事件的代码执行. 2.针对Response.Redirect,请使用重载 Response.Redirect(String url, bool endRespon

java如何正确停止一个线程

Thread类中有start(), stop()方法,不过stop方法已经被废弃掉. 平时其实也有用过,共享一个变量,相当于标志,不断检查标志,判断是否退出线程 如果有阻塞,需要使用Thread的interrupt()方中断阻塞,线程开始检查标志(PS:抛出异常不会退出循环) ------------------------------------------------------------我是copy分割线------------------------------------------

从头认识多线程-1.9 迫使线程停止的方法-return法

这一章节我们来讨论一下还有一种停止线程的方法-return 1.在主线程上面return,是把全部在执行的线程都停掉 package com.ray.deepintothread.ch01.topic_9; public class StopByReturn { public static void main(String[] args) throws InterruptedException { ThreadFive threadFive = new ThreadFive(); Thread

线程异常:undefined reference to &#39;pthread_create&#39; 处理

源码: #include <stdio.h> #include <pthread.h> #include <sched.h> void *producter_f (void *arg); void *consumer_f (void *arg); int buffer_has_item=0; pthread_mutex_t mutex; int running =1 ; int main (void) { pthread_t consumer_t; pthread_t