一、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类的更多相关文章

  1. Java并发基础——Thread

    并发编程可以使我们将程序划分为多个分离的,独立运行的任务.通过多线程机制,这些独立任务都将由执行线程来驱动.在使用线程时,CPU将轮流给每个任务分配占用时间,每个任务都觉得自己在占用CPU,但实际上C ...

  2. Java并发编程-Thread类的使用

    在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换,然后接着 ...

  3. Java 并发基础

    Java 并发基础 标签 : Java基础 线程简述 线程是进程的执行部分,用来完成一定的任务; 线程拥有自己的堆栈,程序计数器和自己的局部变量,但不拥有系统资源, 他与其他线程共享父进程的共享资源及 ...

  4. java并发基础(二)

    <java并发编程实战>终于读完4-7章了,感触很深,但是有些东西还没有吃透,先把已经理解的整理一下.java并发基础(一)是对前3章的总结.这里总结一下第4.5章的东西. 一.java监 ...

  5. java 并发编程——Thread 源码重新学习

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  6. Java并发基础概念

    Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共 ...

  7. java并发基础及原理

    java并发基础知识导图   一 java线程用法 1.1 线程使用方式 1.1.1 继承Thread类 继承Thread类的方式,无返回值,且由于java不支持多继承,继承Thread类后,无法再继 ...

  8. 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...

  9. java并发基础(五)--- 线程池的使用

    第8章介绍的是线程池的使用,直接进入正题. 一.线程饥饿死锁和饱和策略 1.线程饥饿死锁 在线程池中,如果任务依赖其他任务,那么可能产生死锁.举个极端的例子,在单线程的Executor中,如果一个任务 ...

随机推荐

  1. 手写数字识别的k-近邻算法实现

    (本文为原创,请勿在未经允许的情况下转载) 前言 手写字符识别是机器学习的入门问题,k-近邻算法(kNN算法)是机器学习的入门算法.本文将介绍k-近邻算法的原理.手写字符识别问题分析.手写字符识别的k ...

  2. JavaEE权限管理系统的搭建(七)--------管理用户的增删改

    本小结讲解管理用户的增删改查实现, 首先是添加用户,如下图所示,可以看到添加用户的同时也要给用户分配角色,至少给用户分配一个或者是多个角色 页面js部分: $.ajax({ //几个参数需要注意一下 ...

  3. 协议类接口 - UART

    一.何为协议类接口? 双方约定信号的协议和满足时序要求. 二.UART如何传数据 通用异步收发器简称 UART,即“Universal Asynchronous Receiver Transmitte ...

  4. 自动化维护任务 – Automated Maintenance Task (转)

    1. Oracle有三个已定义好的automated maintenance tasks. Automatic Optimizer Statistics Collection—用于收集各种数据库对象的 ...

  5. OGG抽取进程异常问题排查一例

    1.问题现象抽取进程常常running,但是没有新产生trail文件,lag比较大 GGSCI (xxxdb) > info all Program Status Group Lag at Ch ...

  6. c# 分析SQL语句中的表操作

    最近写了很多方向的总结和demo.基本包含了工作中的很多方面,毕竟c#已经高度封装并且提供了很多类库.前面已经总结了博文.最近2天突然感觉前面的SQL分析阻组件的确麻烦,也注意看了下.为了方便大家学习 ...

  7. 蓝图(Blueprint)详解

    Blueprint 模块化 随着flask程序越来越复杂,我们需要对程序进行模块化的处理,针对一个简单的flask程序进行模块化处理 举例来说: 我们有一个博客程序,前台界面需要的路由为:首页,列表, ...

  8. 事物总线模式实例——EventBus实例详解

    事件总线模式是一种广泛运用于安卓开发之中的一种软件架构模式,而事件总线模式在安卓开发中最广泛的应用莫过于AndroidStudio提供的EventBus,所以我就EventBus来谈谈对事件总线模式的 ...

  9. linux安装python并安装pip

    因为最近要在linux环境下进行python编程,所以就试着去安装了一下,但是网上关于python以及pip的安装说实话有点混乱,所以我今天就把前辈的经验再次总结一下,希望可以给大家提供帮助. pyt ...

  10. ruby OpenURI模块使用

    OpenURI is an easy-to-use wrapper for Net::HTTP, Net::HTTPS and Net::FTP(OpenURI支持重定向) 像打开普通文件那样打开ht ...