Java线程的执行顺序是由底层的任务调度器去实现的,不由我们控制
Thread:将线程的创建和任务的创建合并在一起
//通过Thread创建任务
public static void main(String[] args) {
Thread t1 = new Thread("t1"){
@Override
public void run() {
log.info("t1");
}
};
t1.start();
log.info("main");
}
Runnable:将任务的创建和线程的创建分开,脱离了Thread继承体系,更容易与线程池等高级API结合
//先创建Runnable任务再创建线程
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
log.info("t1");
}
};
Thread t1 = new Thread(runnable,"t1");
t1.start();
log.info("main");
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> task = new FutureTask<>(()->{
log.debug("task");
return "task";
});
Thread t1 = new Thread(task,"t1");
t1.start();
log.debug("main");
log.debug("结果是{}",task.get());
}
JDK8后会将只有一个抽象方法的接口(例如Runnable)加上@FunctionalInterface表示当前接口可以使用lambda表达式
//lambda表达式简化写法
public static void main(String[] args) {
Thread t1 = new Thread(()-> log.info("t1"),"t1");
t1.start();
log.info("main");
}
JavaVirtualMachineStacks(Java虚拟机栈),JVM中由堆、栈、方法区所组成,其中栈内存是给线程用的
断点右键指定线程可以调试多个线程运行情况
线程会因为一些原因导致CPU不能继续执行当前线程,转而执行另外一个线程:
当线程发生上下文切换(Context Switch)时,操作系统会保留当前线程的运行状态,同时恢复另外一个线程的状态,Java中的完成这个过程的是程序计数器,它会记录下一条字节码指令的地址,线程上下文切换时,由程序计数器提供地址给Java找到继续运行的线程
start:
run:
sleep:
yield:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有