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) {
} public void run() { 覆盖Thread类的run()方法pauseTime = x;
name = n;
} public static void main(String args[]) {while(true) {
try {
System.out.println(name + ": " +Calendar.getInstance().getTime()); 输出当前日期时间
Thread.sleep(pauseTime);
} catch(Exception e) {
System.out.println(e);
}
}
} } 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 ……TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");
tp1.start(); 通过start()方法启动多线程
TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");
tp2.start();
【思考】不通过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线程也称服务线程,通常编成无限循环,在后台持续运行。 |