网站首页 > java教程 正文
线程详解
在学习计算机的过程中,我们都听过一个词“并行”。并行在计算机中是非常常见的一种操作,是指一系列的计算机执行的任务在计算机中同时被执行。例如在编程的时候,可以听歌,在写文档的时候,还可以去查询其他的文档等等。在单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线程进行分析的。也希望能为大家的学习提供一定的帮助。
- 上一篇: tomcat8.5配置高并发
- 下一篇: 一直搞不清楚SDK和jdk的区别
猜你喜欢
- 2025-01-05 tomcat8.5配置高并发
- 2025-01-05 Java编程-高并发情况下接口性能优化实践-提升吞吐量TPS
- 2025-01-05 Java高并发编程-深入了解Thread类
- 2025-01-05 大促流量激增,通过什么手段提升系统的高并发、高可用性?
- 2025-01-05 Java 多线程与高并发,基础概念回顾
- 2025-01-05 实战场景下的Java高并发知识指南
- 2025-01-05 一篇文章教会你如何搭建高可用高并发系统
- 2025-01-05 一文看透Java高并发:Synchronized锁的性质、原理及其缺陷
- 2025-01-05 Kafka高可用,高吞吐量低延迟的高并发的特性背后实现机制
- 2025-01-05 java 高并发解决方案
你 发表评论:
欢迎- 04-24Java Collections 工具类集合框架中常用算法解析
- 04-24桶排序的简单理解
- 04-24Java集合框架底层实现原理大揭秘
- 04-24Java 集合框架全面解析:选对数据结构,提升开发效率
- 04-24c#集合排序
- 04-24Java面试中常被问到的集合类深度解读
- 04-24VBA技术资料MF278:对集合进行排序
- 04-24Spring 最常用的 7 大类注解,史上最强整理
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)