文章目录
(一)线程的定义
(二)实现多线程的方式
- 继承Thread类
- 实现Runnable接口
(三)Thread常用方法介绍
- 中断线程方法
- interrupt()方法
- 静态方法
- currentThread()方法
- sleep()方法
- yield()方法
- 对象方法
- isAlive()方法
- join()方法
- join(long)方法与sleep(long)方法的区别
(四)停止线程
- 安全的终止线程
- 中断法+boolean变量法
- 抛出异常法+return法
(五)线程优先级
(六)守护线程(Daemon线程)
(七)线程的状态(线程的生命周期)
线程的定义
线程可以理解成是在进程中独立运行的子任务。
实现多线程的方式
- 继承Thread类;
- 实现Runnable接口;
继承Thread类
public class Thread implements Runnable
Thread类实现了Runnable接口,他们之间具有多态关系。
下面是一个创建线程实例,继承Thread类,并且重写run方法。
public class MyThread extends Thread {
@Override
public void run(){
super.run();
System.out.println("MyThread");
}
public static void main(String[]args){
MyThread myThread=new MyThread();
myThread.start();
System.out.println("main running end!");
}
}
运行结果:
main running end!
MyThread
从运行结果可以看出,myThread.run()方法执行的时间比较晚,说明在使用多线程技术时,代码运行的结果与代码执行的顺序无关。
实现Runnable接口
首先,我们来查看一下Thread.java的构造函数:
通过实现Runnable接口,也可以创建线程,将Runnable对象通过Thread类的构造函数传进去,下面展示实例:
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("running!");
}
public static void main(String[]args){
Runnable runnable=new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
System.out.println("main running end!");
}
}
运行结果:
main running end!
running!
因为Java只支持单继承,为了避免这一局限性,可以使用实现Runnable接口的方式来实现多线程技术。
从构造函数Thread(Runnable target)可以看出,我们不光可以传入实现Runnable接口的对象,也可以传入一个Thread类的对象,因为Thread类也实现了Runnable接口,这样做可以将Thraed对象中的run()方法完全交由其他的线程来进行调用。
Thread常用方法介绍
方法名称 | 方法说明 |
---|---|
public synchronized void start() | 启动一个线程,Java虚拟机JVM调用run()方法 |
public final native boolean isAlive(); | isAlive()方法是判断当前线程是否处于活动状态。活动状态是线程已经启动且尚未终止。 |
public void interrupt() | 中断线程 |
public boolean isInterrupted() | 测试线程Thread对象是否中断,但是不会清除中断状态,即再次调用this.isInterrupted()方法,返回true. |
public final synchronized void join(long millis); public final void join(); public final synchronized void join(long millis, int nanos); |
如果线程A执行了thread.join()语句,则当前线程A等待thread线程终止之后才从thread.join()返回。两个超时方法表示,如果线程thread在给定的超时时间里没有终止,那么将会从超时方法中返回。 |
public static boolean interrupted() | 测试当前线程是否中断,执行后会清除中断状态(中断状态会置为false),即第一次调用返回true,再次调用Thread.interrupted()方法,返回false. |
public static native Thread currentThread(); | 返回对当前正在执行的线程对象的引用。 |
public static native void sleep(long millis); public static void sleep(long millis, int nanos) |
sleep()方法是让当前线程“正在执行的线程”休眠(暂停)指定的毫秒数。 |
public static native void yield(); | 让当前线程放弃当前的CPU资源,将CPU让给其他的任务去占用CPU执行时间。由running状态变为ready状态 |
中断线程方法
方法名称 | 方法说明 |
---|---|
public void interrupt() | 中断线程 |
public boolean isInterrupted() | 测试线程Thread对象是否中断,但是不会清除中断状态,即再次调用this.isInterrupted()方法,返回true. |
public static boolean interrupted() | 测试当前线程是否中断,执行后会清除中断状态(中断状态会置为false),即第一次调用返回true,再次调用Thread.interrupted()方法,返回false. |
中断可以理解为线程的一个标识位属性,它表示一个运行中线程是否被其他线程进行了中断操作。其他线程通过调用该线程的interrupt()方法来对它进行中断操作。
interrupt()方法
interrupt()方法的作用是中断线程。对象方法。
方法说明:
1.如果被中断的线程正在调用Object.wait()/Object.wait(long)/Object.wait(long,int),Thread.join()/Thread.join(long)/Thread.join(long,int),Thread.sleep(long)/Thread.sleep(long,int),那么中断状态将会被清除(中断状态置为false),并且抛出InterruptedException异常。
举例说明:
public class InterruptThread{
public static void main(String[]args){
try{
SleepThread sleepThread=new SleepThread();
BusyThread busyThread=new BusyThread();
sleepThread.start();
busyThread.start();
Thread.sleep(1000);
sleepThread.interrupt();
busyThread.interrupt();
System.out.println("busyThread isInterrupted="+busyThread.isInterrupted());
System.out.println("busyThread isInterrupted="+busyThread.isInterrupted());
System.out.println("sleepThread isInterrupted="+sleepThread.isInterrupted());
System.out.println("sleepThread isInterrupted="+sleepThread.isInterrupted());
Thread.currentThread().interrupt();
System.out.println("main interrupted="+Thread.interrupted());
System.out.println("main interrupted="+Thread.interrupted());
} catch (InterruptedExceptio