2021-06-06
作者:互联网
创建和使用线程的几种方法:
//方式1
Thread r = new Thread(){
@Qverride
public void run(){
log.debugg("线程执行内容")
}
}
r.start();
//方式2
//工作内容
Runnable r = new Runnable(){
@Override
public void run() {
System.out.println("工作内容");
}
};
//创建线程
Thread t2 = new Thread(r, "t2");
//执行线程
t2.start();
//方式2.1
//使用lambda表达式创建
Runnable t = () -> System.out.println("sdafa");
Thread t2 = new Thread(t, "t2");
t2.start();
//方式三
//FutureTask 接口继承了Runnable接口,和Future接口,Futre用于返回线程的执行结果;
FutureTask<Integer> ftask = new FutureTask<>(() -> {
System.out.println("111");
//休眠1000毫秒后返回执行结果
Thread.sleep(1000);
return 100;
});
Thread t3 = new Thread(ftask, "t3");
t3.start();
//打印线程的执行结果
System.out.println(ftask.get());
小结:
- 方式一是把线程和任务合并在了一起,方式二是把线程和任务分开了
- 用Runnable 更容易与线程池等高级api配合
- 用Runnable 让任务类脱离了 Thread继承体系,更灵活
相关概念
栈与栈帧
JVM由堆,栈,方法区组成,每个线程启动的时候虚拟机都会分配一块栈内存
- 每个栈由多个栈帧(frame)组成,对应每次方法调用时所占用的内存
- 每个线程只有一个活动栈帧,对应正在执行的方法
线程的上下文切换(Thread Context Switch)
因为以下一些原因导致cpu不再执行当前线程,转而执行下一线程的代码
- 线程的cpu时间片用完
- 垃圾回收
- 有更高优先级的线程许哟啊运行
- 线程自己调用了sleep,yield,wait,join,park,synchronized,lock等方法
- 状态包括包括程序计数器、虚拟机栈中每个栈帧的信息,如变量、操作数栈,返回地址等
- Context Switch 频繁发生会影响性能
常见方法
方法名 | static | 功能说明 | 注意 |
---|---|---|---|
start() | 启动一个新的线程,在新的线程中运行run方法中的代码 | run方法只让线程进入就绪状态,里面代码不一定立刻运行(cpu的时间片还没有分配给它)。每个线程的start()方法只能调用一次,如果调用多次会出现 IllegalThreadStateException | |
run() | 新线程启动后会调用的方法 | 如果在构造 Thread 对象时传递了 Runnable 参数,则线程启动后会调用 Runnable 中的 run 方法,否则默认不执行任何操作。但可以创建 Thread 的子类对象,来覆盖默认行为 | |
join() | 等待线程运行结 | ||
束 | |||
join(long n) | 等待线程运行结束,最多等待 n 毫秒 | ||
getId() | 获取线程长整型的 id | id 唯一 | |
getName() | 获取线程名 | ||
setName(String) | 修改线程名 | ||
getPriority() | 获取线程优先级 | ||
setPriority(int) | 修改线程优先级 | java中规定线程优先级是1~10 的整数,较大的优先级能提高该线程被 CPU 调度的机率 | |
getState() | 获取线程状态 | Java 中线程状态是用 6 个 enum 表示,分别为:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED | |
isInterrupted() | 判断是否被打断, | 不会清除 打断标记 | |
isAlive() | 线程是否存活(还没有运行完毕) | ||
interrupt() | 打断线程 | 如果被打断线程正在 sleep,wait,join 会导致被打断的线程抛出 InterruptedException,并清除 打断标记 ;如果打断的正在运行的线程,则会设置 打断标记 ;park 的线程被打断,也会设置 打断标记 | |
interrupted() | static | 判断当前线程是否被打断 | 会清除 打断标记 |
currentThread() | static | 获取当前正在执行的线程 | |
sleep(long n) | static | 让当前执行的线程休眠n毫秒,休眠时让出 cpu 的时间片给其它线程 | |
yield() | static | 提示线程调度器让出当前线程对CPU的使用 | 主要是为了测试和调试 |
标签:Runnable,06,Thread,t2,线程,2021,打断,new 来源: https://blog.csdn.net/wenriyan/article/details/117630709