1、多线程的实现步骤

方式1:继承Thread类

  • 定义一个类继承Thread类
  • 重写run()方法【run()方法封装线程执行的代码,直接调用相当于普通调用】
  • 创建类对象
  • 启动线程 【start()方法启动线程,然后有JVM调用此线程的run()方法】 ```java import java.util.*; class TimePrinter extends Thread { int pauseTime; //中间休息时间 String name; //名称标识 public TimePrinter(int x , String n) {
    1. pauseTime = x;
    2. name = n;
    } public void run() { 覆盖Thread类的run()方法
    1. while(true) {
    2. try {
    3. System.out.println(name + ": " +Calendar.getInstance().getTime()); 输出当前日期时间
    4. Thread.sleep(pauseTime);
    5. } catch(Exception e) {
    6. System.out.println(e);
    7. }
    8. }
    } public static void main(String args[]) {
    1. TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");
    2. tp1.start(); 通过start()方法启动多线程
    3. TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");
    4. tp2.start();
    } } Fast Guy: Sun May 15 16:31:55 CST 2022 Slow Guy: Sun May 15 16:31:55 CST 2022 Fast Guy: Sun May 15 16:31:57 CST 2022 Fast Guy: Sun May 15 16:31:58 CST 2022 Slow Guy: Sun May 15 16:31:59 CST 2022 Fast Guy: Sun May 15 16:31:59 CST 2022 Fast Guy: Sun May 15 16:32:00 CST 2022 Fast Guy: Sun May 15 16:32:01 CST 2022 Slow Guy: Sun May 15 16:32:02 CST 2022 Fast Guy: Sun May 15 16:32:02 CST 2022 Fast Guy: Sun May 15 16:32:03 CST 2022 Fast Guy: Sun May 15 16:32:04 CST 2022 Slow Guy: Sun May 15 16:32:05 CST 2022 Fast Guy: Sun May 15 16:32:05 CST 2022 Fast Guy: Sun May 15 16:32:06 CST 2022 Fast Guy: Sun May 15 16:32:07 CST 2022 Slow Guy: Sun May 15 16:32:08 CST 2022 Fast Guy: Sun May 15 16:32:08 CST 2022 Fast Guy: Sun May 15 16:32:09 CST 2022 Fast Guy: Sun May 15 16:32:10 CST 2022 ……

【思考】不通过start方法,直接执行run()方法,会产生什么问题? 直接执行run()方法相当于调用普通方法,tp1执行完执行tp2,该题无限循环所以一直执行Fast Guy ```

2、设置和获取线程名称

Thread类中设置和获取线程名称的方法:

  • void setName(String name):将线程名称设置为name
  • String getName( ):返回此线程的名称
  • 通过构造方法设置线程名称

如何获取main( )方法所在的线程名称?

  • public static Thread currentThread( ):返回对当前正在运行的线程对象的引用

    3、线程控制

    | static void sleep(int n) | 使线程睡眠n毫秒,n毫秒后,线程可以再次运行 | | —- | —- | | void join() | 当前线程等待调用该方法的线程结束后, 再往下执行 | | void setDaemon(boolean ) | 设置该线程是守护(daemon)线程还是用户线程,Daemon线程也称服务线程,通常编成无限循环,在后台持续运行。(当执行的线程都是守护线程,JVM虚拟机即将结束,不是立即结束) |

t1、t2和t3 执行t1.join():表示t1执行完毕之后执行剩下的t2和t3

Thread构造方法

public Thread (ThreadGroup group,Runnable target,String name);
public Thread();
public Thread(String name);
public Thread(Runnable target);
public Thread(Runnable target,String name);
public Thread(ThreadGroup group,Runnable target);
public Thread(ThreadGroup group,String name);

Thread类的主要方法

方法 功能
CurrentThread() 返回当前运行的Thread对象
start() 启动线程,让其进入可调度状态
run() 由调度程序调用,当run()方法返回时,该线程停止
stop() 使调用它的线程立即停止执行
sleep(int n) 使线程睡眠n毫秒,n毫秒后,线程可以再次运行
suspend() 使线程挂起,暂停运行Not Runnable
resume() 恢复挂起的线程,使处于可运行状态Runnable
yield() 将CPU控制权主动移交到下一个可运行线程
setName(String name) 赋予线程一个名字
getName() 取得由setName()方法设置的线程名字的字符串
getPriority() 返回线程优先级
setPriority(int) 设置线程优先级
join() 当前线程等待调用该方法的线程结束后, 再往下执行
setDaemon(boolean ) 设置该线程是daemon线程还是用户线程,Daemon线程也称服务线程,通常编成无限循环,在后台持续运行。