目录

一.什么是Thread类

二.Thread类的基本用法

三.线程的并发执行


一.什么是Thread类

在java标准库中,提供了一个Thread类,用来表示/操作线程,Thread类可以视为是Java标准库提供的API,Java是支持多线程编程的,在Java中创建好的Thread实例,其实和操作系统中的线程是一一对应的关系,操作系统提供了一组关于线程的API(C语言),Java对于这组API进一步封装之后就变成了Thread类

二.Thread类的基本用法

1.线程创建

①.最简单的创建方式

//最简单的创建线程方式 写一个类继承线程Thread类 再重写run方法
class MyThread extends Thread{@Overridepublic void run() {System.out.println("hello thread");}}
public class Demo1 {public static void main(String[] args) {Thread t = new MyThread();//创建一个线程t.start();//表示开启一个线程}
}

②.实现runnable接口

//另一种创建线程的方法 实现runnable接口
class MyThread2 implements Runnable{@Overridepublic void run() {System.out.println("hello thread");}
}
public class Demo2 {public static void main(String[] args) {Thread t = new Thread(new MyThread2());//Thread的一种构造方法t.start();}
}

③.使用匿名内部类

public class Demo3 {public static void main(String[] args) {//每一个main都是一个线程  线程是并发执行的Thread t = new Thread(){//使用匿名内部类来创建线程实例@Overridepublic void run() {System.out.println("hello thread");}};t.start();Thread t2 = new Thread(new Runnable() {//使用匿名内部类来实现runnable接口@Overridepublic void run() {System.out.println("hello thread2");}});t2.start();  }
}

④.使用lambda表达式

public class Demo3 {public static void main(String[] args) {//使用lambda表达式来创建线程实例Thread t = new Thread(()->{System.out.println("hello thread");});t.start();}}

2.线程休眠

使用sleep()方法


public class Demo4 {public static void main(String[] args) {Thread t = new Thread(()->{while(true){System.out.println("hello thread");try {Thread.sleep(1000);//休眠(阻塞状态)1000ms后此线程状态转为就绪状态} catch (InterruptedException e) {//常见的线程受查异常 表示线程异常中止e.printStackTrace();}}});t.start();//每隔一秒打印一次}
}

3.线程等待

使用join()方法

public class Demo5 {public static void main(String[] args) {Thread t = new Thread(()->{for (int i = 0; i < 5; i++) {System.out.println("hello thread");try {Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}}});t.start();try {t.join();//等待 等这个线程完成后才进行其他线程  也可以在括号内加数字表示等待线程结束最多等待多长时间都是ms单位} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hh");}
}

4.线程中断

设置标志位

public class Demo6 {public static boolean falg = false;public static void main(String[] args) {Thread t = new Thread(()->{//如何结束一个线程呢 可以设置一个标志位while(!falg){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});//只要改变标志位就可以停止t.start();try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("结束");falg = true;}
}

当然Thread类内部包含了一个boolean的变量可以用来作为标记位,标记是否被中断Thread.interrupted()或者Thread.currentThread().isInterrupted()都可以

public class Demo7 {public static void main(String[] args) {Thread t = new Thread(()->{while(!Thread.currentThread().isInterrupted()){//Thread内部包含了一个boolean的变量可以用来作为标记位 标记是否被中断 或者使用这个Thread.interrupted()也是可以来标记的,但是前面的更常用,Thread.currentThread().isInterrupted()这个方法是判定Thread的普通成员,每个实例都有自己的标志位System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();break;//注意这里的break 没有这个的话进入异常之后还会继续打印的}}});t.start();try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}t.interrupt();//使用thread的对象的interrupt()方法来通知线程结束}
}

Thread.interrupted()线程中断会清除标记位,Thread.currentThread().isInterrupted()线程标记位不会被清空

public class Demo8 {public static void main(String[] args) {Thread t = new Thread(()->{for (int i = 0; i < 5; i++) {System.out.println(Thread.interrupted());}});t.start();t.interrupt();//使用者线程中断会清除标记位Thread t2 = new Thread(()->{for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().isInterrupted());}});t2.start();t2.interrupt();//使用Thread.currentThread().isInterrupted()这个标记位不会被清空}
}

5.获得线程实例 

package thread;public class Demo9 {public static void main(String[] args) {Thread t = new Thread(()->{for (int i = 0; i < 5; i++) {//System.out.println(this.getName());//也可以使用this拿到线程实例但是不能在runnable内使用runnable只是一个单纯的任务,没有name属性System.out.println(Thread.currentThread().getName() + "存活");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "死去");//哪个线程调用Thread.currentThread()这个拿到的就是哪个线程的实例},"process");System.out.println(t.getName() + ":id:" + t.getId());System.out.println(t.getName() + ":名称:" + t.getName());System.out.println(t.getName() + ":状态:" + t.getState());System.out.println(t.getName() + ":优先级:" + t.getPriority());System.out.println(t.getName() + ":是不是后台线程:" + t.isDaemon());System.out.println(t.getName() + ":是否存活:" + t.isAlive());System.out.println(t.getName() + ":是否被中断:" + t.isInterrupted());t.start();while(t.isAlive()){System.out.println(Thread.currentThread().getName() + ":状态:" + t.getState());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

三.线程的并发执行

线程都是并发执行的

//线程都是并发执行的
public class Demo4 {public static void main(String[] args) {Thread t = new Thread(()->{while(true){System.out.println("hello thread");try {Thread.sleep(1000);//休眠1000ms后此线程状态转为就绪状态} catch (InterruptedException e) {//常见的线程受查异常 表示线程异常中止e.printStackTrace();}}});t.start();//每隔一秒打印一次Thread t2 = new Thread(()->{while(true){System.out.println("hello thread2");try {Thread.sleep(1000);//休眠1000ms后此线程状态转为就绪状态} catch (InterruptedException e) {//常见的线程受查异常 表示线程异常中止e.printStackTrace();}}});t2.start();while(true){System.out.println("hello main");//main线程try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

但是其结果并不是按什么顺序打印的,这是因为线程虽说是并发执行,但其实这是包含并发+并行的,只要并行的足够快就可以视为并发执行,因此打印出来的并不是按一定顺序的,可以说是无序,随机的,因此我们可以使用等待方法来控制线程执行的顺序,这里主要控制线程结束的先后顺序(调用join后main线程就会进入阻塞状态,等先要执行的线程执行完了之后才会执行main线程,这样就保证了打印的先后顺序,但是这里不会"死等",可以在括号内设置一个时间保证最多等待多长时间)

Java中的Thread类相关推荐

  1. Java中使用Thread类

    Java的特点之一就是内置对多线程的支持. 每个Java程序都有一个默认的主线程main.如果main方法中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CP ...

  2. Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  3. Java中创建线程需要使用的类_如何通过使用Java中的匿名类创建线程?

    甲线程是可以同时与该程序的其他部分被执行的功能.所有Java程序都有至少一个称为主线程的线程,该线程由Java虚拟机(JVM)在程序启动时由主线程调用main()方法创建. 在Java中,我们可以通过 ...

  4. 在Java中对Singleton类进行双重检查锁定

    Singleton类在Java开发人员中非常常见,但是它给初级开发人员带来了许多挑战. 他们面临的主要挑战之一是如何使Singleton保持为Singleton? 也就是说,无论出于何种原因,如何防止 ...

  5. Java中常用的类,包,接口

    Java中常用的类,包,接口 包名 说明 java.lang 该包提供了Java编程的基础类,例如 Object.Math.String.StringBuffer.System.Thread等,不使用 ...

  6. Java中的condition类

    Java中的condition类 Condition是在java 1.5中才出现的,它用来替代传统的Object的wait().notify()实现线程间的协作, 相比使用Object的wait(). ...

  7. Java中的Unsafe类

    1.Unsafe类介绍 Unsafe类是在sun.misc包下,不属于Java标准.但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty.Hadoo ...

  8. java 中常用的类

    java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l  static double abs(double  a) 获取double 的绝对值 l  sta ...

  9. Java中的BigDecimal类你真的了解吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:HikariCP www.jianshu.com/p/c81 ...

最新文章

  1. JVM:StringTable
  2. pythonos模块使用方法_Python OS模块常用方法总结
  3. 为什么说BCH是最安全的数字货币之一?
  4. 通过Cookie实现客户端与服务端会话的维持;
  5. 亲身验证切实可行的python项目部署方案
  6. Java结束线程的三种方法
  7. socket通信数据类型
  8. Linux目录结构介绍
  9. linux strcpy函数实现,strcpy(char *dest , char *src)的漏洞
  10. c#之 quartz的学习
  11. Linux内核分析学习心得
  12. 大数阶乘 nyoj28
  13. 极域课堂管理系统软件如何取消控制_微缔电子组装业MES系统软件六大功能组成...
  14. 568A以及568B线序
  15. od反汇编linux,新手学习反汇编之OD寻找功能call
  16. maven 报错 Failed to execute goal on project ...: Could not resolve dependencies for project ...
  17. FPGA(一):用Verilog实现流水灯
  18. Linux第7章Gdk及Cairo基础,Linux第7章Gdk及Cairo基础.ppt
  19. win10现在可以双击跑jar包了
  20. css复制功能的方法

热门文章

  1. 将你的老旧Android平板或手机改造成服务器
  2. 国产信创Linux桌面系统比较:软件包格式及软件管理、桌面环境及桌面应用
  3. 使用php生成二维码
  4. MAC系统分区的目录结构
  5. [附源码]计算机毕业设计基于springboot的4s店车辆管理系统
  6. 一道很有意思的面试题目,快加入到这场头脑风暴游戏里吧~
  7. 多张图片合并转为PDF
  8. Samba服务及多用户samba挂载
  9. 【C语言】函数的定义及调用
  10. 软件实施工程师的工作