赞
踩
// 创建线程对象
Thread t = new Thread("thread") { // 线程名称为 thread
@Override
public void run() {
// 要执行的任务
}
};
// 启动线程
t.start();
Runnable runnable = new Runnable() {
@Override
public void run(){
// 要执行的任务
}
};
// 创建线程对象
Thread t = new Thread(runnable, "runnable"); // 线程名称为 runnable
// 启动线程
t.start();
// 创建任务对象
FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// 要执行的任务
return 100;
}
});
// 创建线程对象
Thread t = new Thread(task, "task"); // 线程名称为 task
// 启动线程
t.start();
// 主线程阻塞,同步等待 task 执行完毕的结果
Integer result = task.get();
log.debug("结果:{}", result);
查看当前时刻的所有进程
ps -fe
查看带有关键字 java 的进程
ps -fe | grep java
实时查看所有进程
top
实时查看所有线程
top -H -p 进程PID
查看所有 Java 进程
jps
查看某个 Java 进程的所有线程状态
jstack 进程PID
kill 进程PID
jconsole
java -Djava.rmi.server.hostname=`ip地址` -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=`连接端口` -Dcom.sun.management.jmxremote.ssl=`是否安全连接` - Dcom.sun.management.jmxremote.authenticate=`是否认证` `java类`
Java Virtual Machine Stacks (Java 虚拟机栈)
JVM 由堆、栈、方法区所组成,其中栈内存提供给线程使用,每个线程启动后,虚拟
机就会为其分配一块栈内存。
每个栈由多个栈帧(Frame)组成,对应每次方法调用时所占用的内存。
每个线程只能有一个活动栈帧,对应当前正在执行的那个方法。
以下原因会导致 cpu 不再执行当前的线程,转而执行另一个线程的代码
线程的 cpu 时间片用完。
垃圾回收。
有更高优先级的线程需要运行。
线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法。
当上下文切换(Context Switch)发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的。
状态信息包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等。
上下文切换频繁发生会影响性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。