Java并发基础--Thread类
一、Thread类的构成
Thread类实现Runnable接口。部分源码如下:
二、Thread类常用方法
1.currentThread()方法
currentThread()方法可以返回代码段正在被哪个线程调用的信息,使用如下:
- public class MyThread implements Runnable{
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName());
- }
- public static void main(String[] args) {
- //new Thread(new MyThread()).start();
- new MyThread().run();
- System.out.println(Thread.currentThread().getName());
- }
- }
结果输出:
- main
- main
- public class MyThread implements Runnable{
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName());
- }
- public static void main(String[] args) {
- new Thread(new MyThread()).start();
- //new MyThread().run();
- System.out.println(Thread.currentThread().getName());
- }
- }
结果输出:
- main
- Thread-0
2.isAlive()方法
isAlive()方法主要是判断当前线程是否处于活动状态(线程已经启动且尚未终止),使用如下:
- public class MyThread2 implements Runnable{
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName()+" is alive:"+Thread.currentThread().isAlive());
- }
- public static void main(String[] args) {
- Thread thread = new Thread(new MyThread2());
- thread.start();
- System.out.println(Thread.currentThread().getName());
- System.out.println("main is alive:"+Thread.currentThread().isAlive());
- System.out.println("thread-0 is alive2:"+thread.isAlive());//可能为false,也可能为true,如果run先执行,打印false,否则true
- }
- }
结果输出:
- main
- main is alive:true
- thread-0 is alive2:true
- Thread-0 is alive:true
- 或者
- main
- Thread-0 is alive:true
- main is alive:true
- thread-0 is alive2:false
3.sleep()方法
sleep方法的作用主要是在指定毫秒数内让当前正在执行的线程休眠,暂停执行。特别需要注意的一点,sleep让出CPU,让CPU去执行其他任务,但是当前线程如果持有某个对象的锁,它不会释放锁。
- public class MyThread2 implements Runnable{
- @Override
- public void run() {
- }
- public static void main(String[] args) {
- System.out.println(new Date());
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(new Date());
- }
- }
结果输出:
- Mon Jul 16 21:10:27 CST 2018
- Mon Jul 16 21:10:30 CST 2018
4.yield()方法
yield()方法主要作用是让当前线程交出CPU权限,让CPU去执行其他的线程。它跟sleep方法类似,同样不会释放锁。但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会。需要注意的是yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,这一点是和sleep方法不一样的。
5.join()方法
如果在main方法执行代表某个线程的的thread类的join方法,则main方法会等待thread线程执行完毕或者等待一定的时间。如果调用的是无参join方法,则等待thread执行完毕,如果调用的是指定了时间参数的join方法,则等待一定的时间后如果线程任务还未完成,则不在等待。
- public class MyThread2 implements Runnable{
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName()+" is finish");
- }
- public static void main(String[] args) {
- Thread t = new Thread(new MyThread2());
- t.start();
- try {
- t.join();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName()+" is finish");
- }
- }
结果输出:
- Thread-0 is finish
- main is finish
6.interrupt方法
interrupt方法不能中断正在运行中的线程。可以中断超时等待中的线程,如sleep状态下的线程,如下:
- public class MyThread3 implements Runnable{
- @Override
- public void run() {
- try {
- Thread.sleep(30000);
- } catch (InterruptedException e) {
- System.out.println(Thread.currentThread().getName()+" is interrupted");
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName()+" is finish");
- }
- public static void main(String[] args) {
- Thread t = new Thread(new MyThread3());
- t.start();
- t.interrupt();
- System.out.println(t.getName()+" is isInterrupted?: "+t.isInterrupted());
- System.out.println(Thread.currentThread().getName()+" is finish");
- }
- }
结果输出:
- Thread-0is isInterrupted?: true
- Thread-0is interrupted
- main is finish
- java.lang.InterruptedException: sleep interrupted
- at java.lang.Thread.sleep(Native Method)
- at com.sun.lp.demo.MyThread2.run(MyThread2.java:10)
- at java.lang.Thread.run(Thread.java:748)
- Thread-0 is finish
7.stop()方法
目前已经废弃,它是一个不安全的方法。因为调用stop方法会直接终止run方法的调用,并且会抛出一个ThreadDeath错误。不过多的讨论
8.getName()、setName()和getId()
获取和设置线程的名称。获取线程的ID
9.setDaemon()和isDaemon()
设置线程为守护线程和判断是否是守护线程
守护线程:一种特殊的线程,有陪伴的含义,当进程中不存在非守护线程的时候,则守护线程自动销毁,典型的守护线程是垃圾回收线程。守护线程的作用主要是为其他线程的运行提供便利服务。
10.start()方法
start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源
11.run()方法
run()方法是不需要用户来调用的,当通过start方法启动一个线程之后,当线程获得了CPU执行时间,便进入run方法体去执行具体的任务。注意,继承Thread类必须重写run方法,在run方法中定义具体要执行的任务。
Java并发基础--Thread类的更多相关文章
- Java并发基础——Thread
并发编程可以使我们将程序划分为多个分离的,独立运行的任务.通过多线程机制,这些独立任务都将由执行线程来驱动.在使用线程时,CPU将轮流给每个任务分配占用时间,每个任务都觉得自己在占用CPU,但实际上C ...
- Java并发编程-Thread类的使用
在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换,然后接着 ...
- Java 并发基础
Java 并发基础 标签 : Java基础 线程简述 线程是进程的执行部分,用来完成一定的任务; 线程拥有自己的堆栈,程序计数器和自己的局部变量,但不拥有系统资源, 他与其他线程共享父进程的共享资源及 ...
- java并发基础(二)
<java并发编程实战>终于读完4-7章了,感触很深,但是有些东西还没有吃透,先把已经理解的整理一下.java并发基础(一)是对前3章的总结.这里总结一下第4.5章的东西. 一.java监 ...
- java 并发编程——Thread 源码重新学习
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- Java并发基础概念
Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共 ...
- java并发基础及原理
java并发基础知识导图 一 java线程用法 1.1 线程使用方式 1.1.1 继承Thread类 继承Thread类的方式,无返回值,且由于java不支持多继承,继承Thread类后,无法再继 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...
- java并发基础(五)--- 线程池的使用
第8章介绍的是线程池的使用,直接进入正题. 一.线程饥饿死锁和饱和策略 1.线程饥饿死锁 在线程池中,如果任务依赖其他任务,那么可能产生死锁.举个极端的例子,在单线程的Executor中,如果一个任务 ...
随机推荐
- java 枚举类型enum
简单介绍 Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大家先打开jdk 中的Enum 类简单读一下,这个类 ...
- 【洛谷P1367】蚂蚁
蚂蚁 [题目描述] 在一根无限长的木棍上,用n只蚂蚁,每只蚂蚁有一个初始位置和初始朝向,蚂蚁们以每秒一个单位的速度向前移动,当两只蚂蚁相遇时,它们会掉头(掉头时间忽略不计).现给出每只蚂蚁的初始位置和 ...
- Android学习笔记_51_转android 加载大图片防止内存溢出
首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...
- 数据库查询服务DBCacheServer
各个业务系统,都需要查询各类数据库; 一般查询数据库都是客户端自己连接,根据现在的情况,存在以下几点问题 1.客户端连接很多,连接大小,峰值不可控 2.客户端SQL程序员自己写,参差不齐 3.SQL书 ...
- 全局变量重复定义,fatal error LNK1169: 找到一个或多个多重定义的符号
1.在GlobeValue.h中定义了一个变量: char gl_UID[256]; 2.在b.cpp和e.cpp中分别引用GlobeValue.h,并且使用gl_UID的全局变量, 结果出现:fat ...
- javascript--事件对象e的来源、意义、应用及其属性的用法 function(e){}
在类似于arcgis api for javascript中,经常会遇到function(e),以前一直不懂e是个什么玩意,这种写法啥意思,经过最近一段时间学习,对e有了很深了解,本文通过各种示例,由 ...
- Linux之redis主从复制
redis集群中的数据库复制就是通过主从同步实现的 主节点Master把数据分发给节点Salve 主从同步的好处在高可用, redis节点有冗余设计 redis主从同步的原理 1. 从服务器向主服务器 ...
- 【PHP】PHP常用数组(Array)函数整理
整理了一份PHP开发中数组操作大全,包含有数组操作的基本函数.数组的分段和填充.数组与栈.数组与列队.回调函数.排序.计算.其他的数组函数等. 一.数组操作的基本函数 数组的键名和值 array_va ...
- SVN配置自启动-1053错误
主要内容:解决启动“配置的svn自启动服务”报1053错误 1. 环境: 系统: wind10 svn服务端版本: VisualSVN-Server-3.8.0-x64 2. 配置自启动 以管理员身份 ...
- 03---Nginx配置文件
#启动子进程程序默认用户#user nobody;#一个主进程和多个工作进程.工作进程是单进程的,且不需要特殊授权即可运行:这里定义的是工作进程数量worker_processes 1; #全局错误日 ...