在Java多线程编程中,线程的操作主要包括启动、礼让、等待、中断、终止等。下面是这些操作的代码示例及其注释:
1.启动线程(Start)
使用start()
方法启动线程,使其进入可运行(RUNNABLE)状态。
Thread thread = new Thread(() -> {
// 线程执行的代码
System.out.println("线程 " + Thread.currentThread().getName() + " 正在运行");
});
thread.start(); // 启动线程
2.礼让线程(Yield)
Thread.yield()
方法是一种提示,告诉调度器当前线程愿意让出CPU资源,但调度器可以选择忽略这个提示。这并不是强制性的,而是一种协作机制,可能会礼让不成功。
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " 在运行");
Thread.yield(); // 礼让线程
}
}
3.等待线程(Join)
使用join()
方法使当前线程等待另一个线程完成执行。这在需要等待某个线程完成后再继续执行时非常有用。也可以理解为插队操作,让别的线程优先执行。
Thread t1 = new Thread(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程 t1 执行完毕");
});
t1.start();
try {
t1.join(); // 当前线程等待 t1 线程执行完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程执行完毕");
4. 中断线程(Interrupt)
使用interrupt()
方法中断线程,但线程可以选择是否响应中断。中断一个线程并不会立即停止其执行,而是设置一个中断状态标志,线程可以在适当的时候检查并处理这个标志。
Thread t2 = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("线程 t2 正在运行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("线程 t2 被中断");
Thread.currentThread().interrupt(); // 重新设置中断状态
}
}
});
t2.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.interrupt(); // 中断线程 t2
5. 终止线程(Stop)
虽然Thread
类中有stop()
方法,但该方法已被弃用,因为它可能导致线程在执行到一半时被强制终止,从而导致资源泄露或数据不一致。推荐的做法是使用中断机制来优雅地终止线程。
Thread t3 = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("线程 t3 正在运行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("线程 t3 被中断");
Thread.currentThread().interrupt(); // 重新设置中断状态
}
}
});
t3.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t3.interrupt(); // 中断线程 t3
6. 休眠线程(Sleep)
使用Thread.sleep()
方法使当前线程暂停执行一段时间。这是一个静态方法,调用时会使当前线程进入定时等待(TIMED_WAITING)状态。
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " 在运行");
try {
Thread.sleep(1000); // 线程休眠1秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
通过这些操作,可以更好地控制和管理多线程程序的执行流程,从而实现高效、稳定的并发执行。