目录
线程的生命状态
简要说明
我们可以通过Thread.getState来获取当前线程状态的
返回值 源码是这样说的
返回此线程的状态。此方法设计用于监控系统状态,而不是用于同步控制。
返回值:
这个线程的状态。
实例
Threadtest t1 = new Threadtest();
t1.start();
//获取当前线程的状态
Thread.State state = t1.getState();
System.out.println(state);
class Threadtest extends Thread {
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println(i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
状态整理
面试会考的
值 | 简述 | 状态 |
new | 新建状态 | 刚新建状态,没有被启用 |
runnable | 就绪状态 | 两种情况 1 正在执行 2 获得cpu时间片后就可以执行 |
blocked | 阻塞状态 | 两种情况 1 被某些线程阻塞 2 因等待资源被挂起 |
waiting | 无限等待状态 | 因为等待某些动作被阻塞(wait,join) 与上面不同的是,这种状态需要有其他线程的操作才能唤醒自身 |
time_waiting | 限期等待状态 | (sleep) |
timeend | 终止状态 | 结束线程哩喵 |
多线程的创建方法
使用Thread类
这是最简单的方法,但是无法获取线程返回值,而且无法去扩展程序(继承类)
Threadtest t1 = new Threadtest();
t1.start();
class Threadtest extends Thread {
@Override
public void run() {
for (int i = 0; i < 20000; i++) {
System.out.println(i);
}
}
}
使用Runnable接口
改进了使用Thread类后无法继承其他类的特点,但仍然无法获得返回值
当我们new Runnabletest时,只是创建了线程,只有使用Thread包装后的.start才算运行
//当我们new Runnabletest时,只是创建了线程,只有使用Thread包装后的.start才算运行
Thread t2 = new Thread(new Runnabletest());
t2.start();
class Runnabletest implements Runnable {
@Override
public void run() {
for (int i = 20000; i < 50000; i++) {
System.out.println(i);
}
}
}
使用Callable接口
可以获得线程的返回值了喵
这里必须要使用FutureTask去包装一下的喵,不然线程只是创建但没有运行
//这里必须要使用FutureTask去包装一下的喵,不然线程只是创建但没有运行
FutureTask future=new FutureTask(new Callabletest());
future.run();
try {
//获得线程的返回值
System.out.println(future.get());
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
class Callabletest implements Callable{
@Override
public String call() throws Exception {
return "我是返回值喵";
}
}
Thread常用方法
yield
提示调度程序,当前线程愿意放弃当前对处理器的使用。(礼让,但不一定会成功)
join
让调用的线程等待当前线程
sleep
导致当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,具体取决于系统计时器和调度程序的精度和准确性。 该线程不会失去任何监视器的所有权。
有两种方式
sleep(x)一个参数时代表休眠x毫秒
sleep(x,y)两个参数时表示休眠x毫秒又y纳秒
其中毫秒输入类型是long类型 纳秒输入类型是int类型
start
一个线程的开始,执行之后java虚拟机调用该线程的run方法
结果是两个线程同时运行:当前线程(从调用start方法返回)和另一个线程(执行其run方法)。
interrupt
中断调用方法的进程
interrupted
测试当前线程是否已被中断
如果中断返回true,否则返回false
isInterrupted
测试此线程是否已被中断。
中断则返回true否则返回false
isAlive
测试此线程是否存活。
存活返回true否则返回false
setPriority
更改该线程的优先级
getPriority
获取这个线程的优先级
setName
命名调用该方法的线程
getName
返回此线程的名称。
getThreadGroup
返回该线程的线程组
enumerate
将当前线程的线程组及其子组中的每个活动线程复制到指定的数组中
结果会返回放入数组的数组数量
setDaemon
将线程设置为守护线程
isDaemon
判断线程是否是守护线程
checkAccess
确定当前运行的线程是否具有修改此线程的权限。
toString
返回此线程的字符串表示形式,包括线程的名称,优先级和线程组。
getId
返回此Thread的标识符。 线程ID是创建此线程时生成的正数long 。 线程ID是唯一的,并且在其生命周期内保持不变。 当线程终止时,可以重用该线程ID。
getState
返回此线程的状态。 此方法设计用于监视系统状态,而不是用于同步控制。