线程详解
在学习计算机的过程中,我们都听过一个词“并行”。并行在计算机中是超级常见的一种操作,是指一系列的计算机执行的任务在计算机中同时被执行。例如在编程的时候,可以听歌,在写文档的时候,还可以去查询其他的文档等等。在单CPU的计算机中,并不是真正意义上实现了并行,不过是一种CPU时间片的一种轮转机制。这种机制让用户觉得这些任务是在同一时刻被执行的。当然在多核的计算机中,这种并行操作实则是真实存在的。

线程简介
目前所有的计算机几乎都支持多任务的执行。在计算机中我们将每一个任务看作一个进程(Process),在每个进程中至少运行着一个线程(Thread),所以有时候我们将线程看作一个轻量级的进程。

线程是程序执行的一个空间,每个线程都有自己的局部变量表、程序计数器以及线程自己的生命周期,在现代的计算机操作系统中一般不止一个线程在运行,拿JVM来讲,我们启动了一个JVM之后,从操作系统层面就会创建一个新的进程也就是JVM的运行进程,在我们运行了JVM之后就会在JVM的进程中就会产生许多的线程。

如何快速创建一个线程并启动
在日常快节奏的生活中常常会有这样的场景,我们一边吃饭,一边看电视,这里我们就用这个例子来看一下Java中如何实现这个场景。
第一创建接口类代码如下
public interface DoSomething {
public void watch() throws InterruptedException;
public void eat() throws InterruptedException;
}
继承接口类实现了边看电视边吃饭的实现类
public class WatchAndEat implements DoSomething{
public void watch() throws InterruptedException {
for (;;) {
doWatch();
sleep(1000);
}
}
public void eat() throws InterruptedException {
for (;;){
doEat();
sleep(1000);
}
}
private void doWatch() {
System.out.println("我在看电视");
}
private void doEat(){
System.out.println("我在吃饭");
}
}
接下来采用单线程的方式来实现这个操作
public class MainTest {
/**
* 第一描述一个单线程场景
* 1.创建一个主线程入口
* 2.创建一个看电视方法
* 3.创建一个吃饭的方法
*
* 4.测试结果
*/
public static void main(String[] args) throws InterruptedException {
WatchAndEat watchAndEat = new WatchAndEat();
watchAndEat.watch();
watchAndEat.eat();
}
}
查看运行结果,从运行结果中我们可以看到,程序是从上到下执行的,所以说会一直进入到我看电视的方法中。由于方法中的是一个死循环,所以会一直打印“我在看电视”。

如何让看电视和吃饭并发的进行输出呢?
如何让看电视和吃饭并发执行,实则就是想看到在Console中看电视和吃饭交替输出就可以了。这就要借助Java多线程来实现,在Java中实现多线程必不可少的类就是Thread类了。通过这个类可以实现多线程的操作,这里由于是演示代码,所以对Thread类先不做太多的说明。在后续的分享中会详细介绍这个Java类。
实则想要实现并发操作只需要将主启动文件中的代码换成如下的操作就可以了。
public class MainThreadTest {
public static void main(String[] args) throws InterruptedException {
final WatchAndEat watchAndEat = new WatchAndEat();
new Thread(()->{
try {
watchAndEat.eat();
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
watchAndEat.watch();
}
}
运行代码之后会看到控制台会交替打印如下的内容,这就说明我们的并行设计是没有问题的。也不会将代码卡到死循环中。

上面代码中,线程启动必须在其中一个任务之前,否则线程就永远不会启动,由于前一个任务永远不会结束。
可以使用JConsole观察线程运行情况
在控制台中输入 jconsole 命令就可以启动了,启动之后就会看到上面的程序执行效果。然后点击对应的进程就可以进入分析。

从图中可以看到,除了运行的主线程main和Thread-0线程之外还有许多的辅助线程在执行。

详细分析Thread-0之后还可以看到如下的一些内容,看到线程启动,线程的启动入口。等等信息。

总结
这篇文章,主要介绍了线程的一些基础相关的信息,并且演示了线程的一些简单的操作,还通过JVM的线程查看工具,查看线程的运行情况。这些工具都是有助于我们后续的对Java线程进行分析的。也希望能为大家的学习提供必定的协助。


