1.2执行更高级的线程任务(Performing More Advanced Thread Tasks)
来源:互联网 发布:csmar数据库 编辑:程序博客网 时间:2024/06/09 15:40
在前面的线程任务都连接着一个设定的Thread对象,和开启连接着thread。然而,这个Thread也提供着更多高级的任务,包括打断其它线程的执行、合并一个线程到另一个线程,和导致一个线程去休眠。
1.2.1打断线程(Interruption Threads)
这个Thread提供给每一个线程可以打断另一个线程的打断机制。当一个线程被打断,它将会抛出java.lang.InterruptedException的异常。这个机制包含了下面三个的方法:
(1) void interrupt():通过Thread的这个方法来打断一个线程。当一个线程因为请求Thread的sleep()或join()的方法而阻塞时,这个线程被打断将会抛出 InterruptedException。
(2) static boolean interrupted():测试当前的线程是否被打断,如果是将会返回true。线程是否被打断,通过这个方法是可以明确的。
(3) boolean isInterrupted():测试这个线程是否已经被打断,如果是将会返回true。这个线程的打断状态在这个方法是不被影响的。
我创建一个应用,这个应用是证明线程被打断的。看Listing1-2.
Listing1-2 证明线程打断。
package com.owen.thread.chapter1;public class ThreadInterruption{public static void main(String[] args){Runnable r = new Runnable(){@Overridepublic void run(){String name = Thread.currentThread().getName();int count = 0;while (!Thread.interrupted())System.out.println(name + ": " + count++);}};Thread thdA = new Thread(r);Thread thdB = new Thread(r);thdA.start();thdB.start();while (true){double n = Math.random();if (n >= 0.49999999 && n <= 0.50000001)break;}thdA.interrupt();thdB.interrupt();}}
在主线程中第一次创建一个Runnable的线程,包含了当前线程和名字。这个Runnbale声明了一个计数器,和将其放入到while的循环体内,然后不断地打印出一个线程的名字和计数器的值,在线程没有被打断前这个计数器是在不断地增加。
接下来是创建一对Thread的对象,这个线程是执行这个Runnable和开启后台的线程。
为了在打断线程之前,给后台的线程打印出几条信息,我们在主线程加入了一个while的循环语句,为个循环的设计为了消耗点时间。这个循环是在重复包含着一个随机数,直到个数是在我们规定的范围内。
Note 一个循环产生随机数的设计不是很好和想法,它会浪费处理器的周期。
主线程的循环结束后,主线程就会在每一个后台的线程Thread对象执行infterrupt()方法。接下来就是后台线程执行Thread.interrupted(),这个方法将会返回一个true,后台线程也就会结束。
执行上面的代码,你可能会看到如下的结果。
Thread-1: 67Thread-1: 68Thread-0: 768Thread-1: 69Thread-0: 769Thread-0: 770Thread-1: 70Thread-0: 771Thread-0: 772Thread-1: 71Thread-0: 773Thread-1: 72Thread-0: 774Thread-1: 73Thread-0: 775Thread-0: 776Thread-0: 777Thread-0: 778Thread-1: 74Thread-0: 779Thread-1: 75
源码下载:git@github.com:owenwilliam/Thread.git
- 1.2执行更高级的线程任务(Performing More Advanced Thread Tasks)
- CoreBluetooth第一节:Performing Common Central Role Tasks(执行常见的核心端任务)
- (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)
- Ubuntu:Performing Essential System Administration Tasks (Ubuntu服务器系统管理核心任务)
- RT-Thread的线程(任务)处理
- 关于自定义任务(Tasks)的心得
- CoreBluetooth第二节:Performing Common Peripheral Role Task(执行常见的外设端任务)
- Thread的join的用法(线程执行排序)
- RT-Thread的线程(任务)处理【RT-Thread学习笔记 2】
- 【RT-Thread学习笔记 2】RT-Thread的线程(任务)处理
- 安卓(Android)中如何优雅的 创建/执行 异步任务/回调(AsyncTask 、Thread、Job、CallBack、Handler) ?线程池(Executor)
- thread 线程执行顺序
- 关于ArcGIS Server自定义任务(Tasks)的心得
- UE4 渲染线程执行任务的流程
- iOS-Performing Common Peripheral Role Tasks(API Reference)the fourth part
- 6.5 Performing UI-Related Tasks with GCD
- 怎样把ACE_Task当作更高级的线程来使用
- Java定时任务的几种方法(Thread 和 Timer,线程池)
- leapmotion simple control 插件的使用
- Codeforces 750 D New Year and Fireworks
- 将数据的初始化放到docker中的整个工作过程(问题记录)
- java设计模式之单例模式5种方法及优缺点小结
- 周小结
- 1.2执行更高级的线程任务(Performing More Advanced Thread Tasks)
- 常见Map 及 ArrayList 是否有序总结
- 蓝桥-ALGO-26-麦森数
- 利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置
- 牛客错题1
- 如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】
- Rcpp手册(旧)
- 2017 山东理工第九届校赛 H C~K玩游戏(博弈)
- 日拱一卒——160个crackme之#3