编程语言
首页 > 编程语言> > 2、 Java 线程

2、 Java 线程

作者:互联网

2.1 创建和运行线程

方法一,直接使用 Thread

// 创建线程对象
Thread t = new Thread() {
	public void run() {
		// 要执行的任务
	}
};
// 启动线程
t.start();

方法二,使用 Runnable 配合 Thread

把【线程】和【任务】(要执行的代码)分开

Runnable runnable = new Runnable() {
	public void run(){
		// 要执行的任务
	 }
};
// 创建线程对象
Thread t = new Thread( runnable );
// 启动线程
t.start();

Java 8 以后可以使用 lambda 精简代码

// 创建任务对象
Runnable task2 = () -> log.debug("hello");
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();

* 原理之 Thread 与 Runnable 的关系

分析 Thread 的源码,理清它与 Runnable 的关系

事实是Thread和Runnable没有本质的区别,这才是正确的结论,和自以为是的大神所说的Runnable更容易实现资源共享,没有半点关系!
结论,Thread和Runnable的实质是继承关系,没有可比性。
无论使用Runnable还是Thread,都会new Thread,然后执行run方法。
用法上,如果有复杂的线程操作需求,那就选择继承Thread,如果只是简单的执行一个任务,那就实现runnable。

彻底理解Runnable和Thread的区别

小结

方法三,FutureTask 配合 Thread

FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况,其get方法可以阻塞线程并等待结果

// 创建任务对象
FutureTask<Integer> task3 = new FutureTask<>(() -> {
	log.debug("hello");
	return 100;
});
// 参数1 是任务对象; 参数2 是线程名字,推荐
new Thread(task3, "t3").start();
// 主线程阻塞,同步等待 task 执行完毕的结果
Integer result = task3.get();
log.debug("结果是:{}", result);

2.2 查看进程线程的方法

windows

linux

Java

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类

2.3 * 原理之线程运行

栈与栈帧

Java Virtual Machine Stacks (Java 虚拟机栈)

我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。

线程上下文切换(Thread Context Switch)

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

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

未完……

标签:Runnable,Java,Thread,线程,new,jmxremote
来源: https://blog.csdn.net/qq_44006819/article/details/116070609