问题描述
- 关于java线程的基础知识
-
public class ThreadTest {public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub Runnable r=new Runnable() { @Override public void run() { // TODO Auto-generated method stub try{ Thread.sleep(5000); }catch(InterruptedException e){ System.out.println("interrupted"); } System.out.println("ran"); } }; Thread t=new Thread(r); t.start(); System.out.println("started"); t.sleep(2000); System.out.println("interrupting"); t.interrupt(); System.out.println("ended"); }
}
为什么会输出
started
interrupting
interrupted
ran
ended而t.sleep()中的数字大于5000时则输出
started
ran
interrupting
ended
解决方案
首先,sleep是Thread类的静态方法,它只会让当前线程休眠,在main函数中的t. sleep本质上是让main线程休眠,而不是让线程t休眠,你的Runnable中的休眠方法调用才是正确的。其次,分析下休眠时间,main线程休眠超过5秒后才中断线程t,而此时线程t已经运行结束了,所以这个t. interrupt操作已经失效了。不超过5秒时,线程t仍处于休眠阶段而响应中断进入异常分支,所以打印了中断信息。
解决方案二:
在阻塞操作时如Thread.sleep()时被中断会抛出InterruptedException(注意,进行不能中断的IO操作而阻塞和要获得对象的锁调用对象的synchronized方法而阻塞时不会抛出InterruptedException)
解决方案三:
线程:
? ? ? ?线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。Java中的线程有......
答案就在这里:Java线程基础知识
时间: 2024-11-17 16:13:14