java-并发-线程对象
浏览以下内容前,请点击并阅读 声明
线程对象
每个线程都和类Thread的实例相关,有两种基本的使用Thread对象来创建并发应用的方法:
- 直接控制线程的创建和管理,每次需要开始一个异步任务时简单地实例化Thread类。
- 从你的程序中转移线程的管理,将应用的任务传递给一个执行程序。
本章主要讨论Thread类。
定义并启动一个线程
创建一个线程对象必须提供线程中执行的代码,实现的方法有两种:
- 实现Runnable接口,Runnable接口定义了一个run方法,该方法中含有在线程中执行的方法,Runnable对象作为参数传递给Thread类的构造器来创建新的Thread实例,如下所示:
public class HelloRunnable implements Runnable {
public void run() {
System.out.println("Hello from a thread!");
}
//以下主方法创利用定义的Runnable的实现类建类一个线程对象
public static void main(String args[]) {
(new Thread(new HelloRunnable())).start();
}
}
- 继承Thread类,Thread类自身是实现Runnable接口的,尽管其run方法不执行任何操作,一个类可以继承Thread类,覆写run方法,如下所示:
public class HelloThread extends Thread {
public void run() {
System.out.println("Hello from a thread!");
}
public static void main(String args[]) {
(new HelloThread()).start();
} }
两个例子中,调用Thread实例中的start方法的作用就是启动新创建的线程。
对于这两种方法我们使用那种呢?第一种方法使用更为广泛一些,因为实现Runnable后不仅可以创建新的线程,而且还可以继承除Thread的其他类。而第二种用法在简单的应用中则更为快捷,但是不能再继承其他类。以下举例都用第一种方法,因为该方法更加灵活,更重要的是其适用于更高级的线程管理API。
用sleep方法暂停执行
Thread.sleep方法会导致当前的线程暂停指定的时间。这个方法在需要将处理器时间交给其他线程或进程的时候比较有效。
sleep方法由两个重载的版本,一个指定休眠的毫秒数,另外一个指定休眠的纳秒数,当然,时间不一定精确,计时是由底层的操作系统决定的,睡眠期间可以终止,因此任何时候,你都不要指望sleep方法能够暂停你指定的时间长度。
中断
中断是指示一个线程停下当前所做的事情去做另外一件事,一个线程对于中断的反应是由程序员决定的,不过一般都是终止该线程。通过调用一个线程对象的interrupt方法,可以中断该线程,为了使中断机制正常运行,被中断的线程必须支持自身的中断。
支持中断
要使一个线程支持中断,则要在确保在线程接受到中断指示时从run方法返回,如果该线程经常调用一些抛出InterruptedException
的方法,那么捕获InterruptedException
后,就应该使用return语句返回,如果没有使用抛出中断异常的方法,则要使用定期使用Thread.interrupted方法判断该线程是否被中断,如果中断,使用return语句返回:
for (int i = 0; i < inputs.length; i++) {
heavyCrunch(inputs[i]);
if (Thread.interrupted()) {
//如果被中断,则返回
return;
}
}
中断状态标志
中断机制是用一个内部的标志,叫做中断状态实现的,调用Thread.interrupt
方法将设定该标志,当通过一个静态方法Thread.interrupt
ed来检查中断状态时,中断状态会被清除,非静态方法isInterrupted,一个线程用来检查另外一个线程的中断状态的,该方法不会改变中断状态。
在一个线程中,所有因抛出InterruptedException
而返回的方法都会清除中断状态,但不排除之后立马会有其他线程设置其中断状态。
join方法
join方法的使用允许一个线程等待另一个线程执行完毕,如果t是一个当前正在执行的Thread对象,则:
t.join();
以上方法会让当前的线程暂停执行直到t执行完毕为止。join方法还有另外一个重载的版本,可以加入参数指定最长的等待时间,超过该时间后将不再等待。和sleep一样,其时间的准确性由系统而定,同时能对中断响应。
java-并发-线程对象的更多相关文章
- Java 并发 线程同步
Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大 ...
- Java 并发 线程的生命周期
Java 并发 线程的生命周期 @author ixenos 线程的生命周期 线程状态: a) New 新建 b) Runnable 可运行 c) Running 运行 (调用 ...
- Java 并发 线程的优先级
Java 并发 线程的优先级 @author ixenos 低优先级线程的执行时刻 1.在任意时刻,当有多个线程处于可运行状态时,运行系统总是挑选一个优先级最高的线程执行,只有当线程停止.退出或者由于 ...
- Java 并发 线程属性
Java 并发 线程属性 @author ixenos 线程优先级 1.每当线程调度器有机会选择新线程时,首先选择具有较高优先级的线程 2.默认情况下,一个线程继承它的父线程的优先级 当在一个运行的线 ...
- Java并发——线程安全、线程同步、线程通信
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
- Java并发——线程池原理
"池"技术对我们来说是非常熟悉的一个概念,它的引入是为了在某些场景下提高系统某些关键节点性能,最典型的例子就是数据库连接池,JDBC是一种服务供应接口(SPI),具体的数据库连接实 ...
- 从JDK源码角度看java并发线程的中断
线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止.在java中要让线程安全.快速.可靠 ...
- Java并发——线程介绍
前言: 互联网时代已经发展到了现在.从以前只考虑小流量到现在不得不去考虑高并发的问题.扯到了高并发的问题就要扯到线程的问题.你是否问过自己,你真正了解线程吗?还是你只知道一些其他博客里写的使用方法.下 ...
- java并发线程池---了解ThreadPoolExecutor就够了
总结:线程池的特点是,在线程的数量=corePoolSize后,仅任务队列满了之后,才会从任务队列中取出一个任务,然后构造一个新的线程,循环往复直到线程数量达到maximumPoolSize执行拒绝策 ...
- Java 并发--线程创建
随着处理器的多核化,为提高处理器的资源利用率应用程序的并发变应运而生了.现在的操作系统是多任务操作系统,多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的内存空间 ...
随机推荐
- 安装sitecore数据库和客户端到本机
(提前先装好数据库和IIS) 安装教程下载:http://download.csdn.net/detail/qq1162195421/6436799 安装过程省略... 1.安装好之后,会自动在安装路 ...
- 夏夏的php开发笔记开写啦
主要写一些平时drupal.dedecms.帝国cms.wordpress等php程序开发过程中遇到的问题,以及解决的过程,记录夏夏的成长,把握契机,创造未来
- 转DNS DLZ +MYSQL
关于bind的软件介绍这里就不讲解了 大家都知道是干嘛的 这里多介绍一下DLZ这个东西 大家都知道维护bind的时候 如果想新增一个zone 需要vim 编辑添加 这样.....然后bind启动后从 ...
- html5 拖拽函数1--不兼容火狐
拖拽元素事件<br/>ondragstart拖拽前触发<br/>ondrag拖拽结束之前连续触发<br/>ondragend 拖拽结束前触发<br/>目 ...
- 【Network】TCPDUMP 详解
参考资料: https://www.baidu.com/s?ie=UTF-8&wd=tcpdump%20%E6%8C%87%E5%AE%9Aip tcpdump非常实用的抓包实例: http ...
- 定时器管理:nginx的红黑树和libevent的堆
libevent 发生超时后, while循环一次从堆顶del timer——直到最新调整的最小堆顶不是超时事件为止,(实际是del event),但是会稍后把这个timeout的 event放到ac ...
- 在WebPart中获取Office 365中的未读邮件数
// Create the web request HttpWebRequest request = WebRequest.Create("https://outlook.office365 ...
- 第三天--html区块
<!Doctype html><html> <head> <meta charset="utf-8"> ...
- gdb调试汇编堆栈过程的学习
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...
- oracle打补丁
oracle 数据库补丁安装(单实例) ------------24006111 注:务必先安装24006111再安装24315821,否则无法进行正常的补丁安装流程.1.关闭数据库监听和数据库实例 ...