线程的创建和使用

创建线程

Java语言的JVM允许程序运行多个线程,它使用java.lang.Thread类来实现

Thread类的特性:

  • 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体叫做线程体
  • 通过该Thread对象的start()方法来启动这个线程,而不是使用run()
  1. /**
  2. * 创建多线程:方式一:继承Thread类
  3. * @author hsy
  4. * @date 2022/12/19
  5. */
  6. class myThread extends Thread{
  7. @Override
  8. public void run() {
  9. for (int i = 0; i < 100; i++) {
  10. if(i%2==0){
  11. System.out.println(i);
  12. }
  13. }
  14. }
  15. }
  16. public class ThreadTest {
  17. public static void main(String[] args) {
  18. myThread t1 = new myThread();
  19. t1.start();
  20. }
  21. }
  22. /**
  23. * 创建多线程:方式二:实现Runnable接口
  24. * @author hsy
  25. * @date 2022/12/19
  26. */
  27. class MThread implements Runnable{
  28. @Override
  29. public void run() {
  30. for (int i = 0; i < 100; i++) {
  31. if(i%2==0){
  32. System.out.println(i);
  33. }
  34. }
  35. }
  36. }
  37. public class ThreadTest1 {
  38. public static void main(String[] args) {
  39. MThread mThread = new MThread();
  40. new Thread(mThread).start();
  41. }
  42. }

srart()方法有两个作用:一是启动当前的线程,二是调用当前线程的run()方法

注意:不能通过调用对象的run方法启动线程,这样做相当于在主线程中调用方法,没用开启新的线程。当需要建立多个线程的时候,需要new多个线程的对象,不能多次调用start方法,一个线程只能调用一次start方法

两种创建方式比较:

开发中:优先选择实现Runnable接口的方式

原因:1. 实现的方法没有类的单继承性的局限性

  1. 2.实现的方式更适合来处理多个线程共享数据的情况

相同点:两种方式都需要重写run方法,将线程要执行的逻辑声明在run方法中

线程的分类

Java中的线程分为两类:守护线程和用户线程

  • 这两个在每个方面几乎相同,唯一区别是判断JVM何时离开
  • 守护线程是用来服务用户的线程,通过在start()方法前调用thread.setDaemon(true)可以把一个2用户线程变成一个守护线程
  • Java垃圾回收机制就是一个守护线程
  • 若JVM中都是守护线程,当前JVM退出

线程的常用方法

  1. void srart():启动线程,并执行对象的run()方法
  2. run():线程在调度时执行的操作
  3. String getName():返回线程的名字
  4. void setName(String Name):设置该线程的名字
  5. static Thread currentThread():返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类
  6. yield():释放当前cpu的执行权
  7. join():在线程a中调用线程bjoin方法,此时线程a就进入阻塞状态,直到线程b完全执行完之后,线程a才结束阻塞状态
  8. sleep(long millitime):让当前线程睡眠指定的milltime毫秒,在指定的millitime毫秒时间内,当前线程是阻塞状态
  9. isAlive():判断当前线程是否存活

线程的调度

  • 调度策略
    image.png
  • Java的调度方法
    image.png

线程的优先级

  • 线程的优先等级
    • MAX_PRIORITY:10
    • MIN_PRIORITY:1
    • NORM_PRIORITY:5
  • 涉及的方法
    • getPriority():返回线程优先值
    • setPriority(int new Priority):改变线程的优先级
  • 说明
    • 线程创建时继承父类的优先级
    • 低优先级只是获得调度的可能性很低,并非一定是在高优先级线程调度之后才被调用