继承类或接口
可以选择继承Thread类或使用Runnable接口
通常建议使用Runnable接口:java只能继承一个类,但能同时使用多个接口
继承或使用接口都要重写run() 方法,run方法里是线程的具体功能实现
使用接口在主方法创建对象的时候需额外创建Thread对象:
className1 pl=new className1('a',50);
className2 pn=new className2(50);
Thread t1= new Thread(pl);
Thread t2=new Thread(pn);
t1. start();
t2. start();
通常一个类只能创建一个线程,也有特殊方法,如:
public class MultiThreadExample {
public static void main(String[] args) {
// 创建第一个线程
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 1: " + i);
}
});
// 创建第二个线程
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 2: " + i);
}
});
// 启动线程
thread1.start();
thread2.start();
}
}
线程方法:
start():启动线程,即调用run中的方法
sleep(long millis): 使当前线程暂停执行一段时间(以毫秒为单位),让其他线程执行。
sleep方法要和try-catch一起使用
线程在休眠期间可能被中断,而中断会导致
sleep()
方法提前结束,会抛出InterruptedException
异常导致程序中断,所以需要处理异常try { Thread.sleep(100);; }catch(InterruptedException e) { break; }
一般使用break直接跳出run()方法即可,后续的操作会在actionPerformed()方法里重新生成新的线程,并再次调用run
interrupt(): 中断线程。
中断线程后线程已经结束生命周期,不能再次启动,除非再次创建新的线程
而在actionPerformed()方法中,程序会一遍一遍的循环,从而实现对线程的操控
isAlive(): 判断线程是否处于活动状态。返回 true
isInterrupted(): 检查线程是否被中断,如果线程被中断,则返回 true
。
getState(): 获取线程的状态。
getName(): 获取线程的名称。
setName(String name): 设置线程的名称。
currentThread(): 获取当前正在执行的线程对象。
通常和getName或setName使用用于查看当前运行的线程
currentThread.getName()
synchronized线程同步机制:
1. 同步代码块:
public void someMethod() {
// 需要进行同步控制的代码块
synchronized (this) {
// 仅在 synchronized 块中的代码被同步,只有一个线程可以进入该代码块
// this 是锁定的对象,可以使用其他对象作为锁,但需注意锁的唯一性
// 在此处编写需要同步的代码逻辑
}
}
2. 同步方法:
public synchronized void someMethod() {
// 在方法内部的代码块被同步,同一时间只允许一个线程执行该方法
// this 是锁定的对象,对于实例方法,锁对象是当前实例对象(this)
// 在此处编写需要同步的代码逻辑
}
3. 静态同步方法:
public static synchronized void someStaticMethod() {
// 静态方法被 synchronized 修饰,锁对象是类的 Class 对象
// 在此处编写需要同步的静态方法代码逻辑
}
注意事项:
1.定义变量或对象时可以不着急初始化,留到类中更方便
2.再调用方法前必须检查是否初始化,否则会结果异常
3.如果需要在初始化之前调用对应的方法,可以用类名调用,以Thread对象为例:
对象名.方法,当该对象未来得及初始化的时候,可以代替为
Thread.方法