当前位置:   article > 正文

Java并发编程 - 第二章 - 线程_每个线程职能有一个活动栈帧

每个线程职能有一个活动栈帧

一、线程的创建与运行

1.1 使用 Thread 创建线程
// 创建线程对象
Thread t = new Thread("thread") { // 线程名称为 thread
    @Override
    public void run() {
        // 要执行的任务
    }
};
// 启动线程
t.start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
1.2 使用 Runnable 创建线程
Runnable runnable = new Runnable() {
	@Override
    public void run(){
        // 要执行的任务
    }
};
// 创建线程对象
Thread t = new Thread(runnable, "runnable"); // 线程名称为 runnable
// 启动线程
t.start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
1.3 Thread 与 Runnable 的关系
  • 用 Thread 是把线程和任务合并了,用 Runnable 是把线程和任务分开了。
  • 用 Runnable 更容易与线程池等高级 API 配合。
  • 用 Runnable 让任务类脱离了 Thread 继承体系,更加灵活。
1.4 使用 FutureTask 创建线程
// 创建任务对象
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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

二、查看进程与线程

2.1 查看进程

查看当前时刻的所有进程

ps -fe
  • 1

查看带有关键字 java 的进程

ps -fe | grep java
  • 1

实时查看所有进程

top
  • 1

实时查看所有线程

top -H -p 进程PID
  • 1

查看所有 Java 进程

jps
  • 1

查看某个 Java 进程的所有线程状态

jstack 进程PID
  • 1
2.2 杀死进程
kill 进程PID
  • 1
2.3 远程监控

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类`
  • 1

三、线程运行原理

3.1 栈与栈帧

Java Virtual Machine Stacks (Java 虚拟机栈)

JVM 由堆、栈、方法区所组成,其中栈内存提供给线程使用,每个线程启动后,虚拟
机就会为其分配一块栈内存。

每个栈由多个栈帧(Frame)组成,对应每次方法调用时所占用的内存。

每个线程只能有一个活动栈帧,对应当前正在执行的那个方法。

3.2 线程上下文切换

以下原因会导致 cpu 不再执行当前的线程,转而执行另一个线程的代码

  • 线程的 cpu 时间片用完。

  • 垃圾回收。

  • 有更高优先级的线程需要运行。

  • 线程自己调用了 sleep、yield、wait、join、park、synchronized、lock 等方法。

当上下文切换(Context Switch)发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条 jvm 指令的执行地址,是线程私有的。

  • 状态信息包括程序计数器、虚拟机栈中每个栈帧的信息,如局部变量、操作数栈、返回地址等。

  • 上下文切换频繁发生会影响性能。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/220801
推荐阅读
相关标签
  

闽ICP备14008679号