对于java的并发编程方面的东东,不管是面试还是实际工作开发都是非常重要的,而往往只要涉及到并发相关的东东有点让人觉得有点难,而实际工作中涉及到并发可能就是简单的用下同步块、上锁之类的一些简单的操作,而还对其使用理解上不是特别透彻,另外为了简单编写并发相关的东东,JDK5以后出现了并发包,而说实话对于这些并发包的东东一点都不太了解,所以很有必要系统全面深度的去掌握它,并将其应用于实际工作当去。

在深入之前首先先打好线程相关的一些基础,基础是深入理解的一个奠基石,所以这里从最基础的创建线程及线程的启动开始记录,一定得要重视基础!!!

在正式编码之前,开发工具还是选用InterliJ IDEA,谁用谁知道,接着正式编码,这里从模拟一个场景:模拟读数据库的过程中,同时要写一些磁盘信息,很显示要用到多线程相关的东东,直接开始编码:

/**
* 基础巩固----线程创建及启动
* 场景:模拟读数据库的过程中,同时要写一些磁盘信息
*/
public class TryConcurrency { public static void main(String[] args) {
readFromDataBase();
writeDataToFile();
} //读数据库
private static void readFromDataBase() {
//read data from database and handle it.
try {
println("Begin read data from db.");
Thread.sleep(1000 * 10L);
println("Begin read data done and start handle it.");
} catch (InterruptedException e) {
e.printStackTrace();
} println("The data handle finish and successfully.");
} //写文件
private static void writeDataToFile() {
try {
println("Begin write data to file.");
Thread.sleep(2000 * 10L);
println("Write data done and start handle it.");
} catch (InterruptedException e) {
e.printStackTrace();
} println("The data handle finish and successfully.");
} private static void println(String message) {
System.out.println(message);
} }

很显然,这是同步的方式,不可能满足我们的要求,所以这时需要用到多线程,关于怎么创建及启动线程其实人人皆知,但不直接写出代码而是从官方文档上来学习,因为有一些我们忽略的地方,有一些不太熟知的概念就是来源于官方对类的说明文档中,所以打开JDK的文档,找到Thread类:

如何证明呢?这时可以用JDK自带的jconsole命令来连接到JVM查看到,在查看之前先给我们程序加个休眠以便进程不退出便于用jconsole去查看该进程的线程情况:

首先先启动咱们的程序:

然后在命令行中执行jconsole,这时就会打开一个连接终端:

然后连接:

而除它之后的线程都是守护型的线程:

所以当JVM启动起来之后,它的线程情况用一个图来表示如下:

接着来使用一下多线程,直接上代码,都是比较基础的:

运行:

这时再用jconsole来查看一下我们自定义的线程是否在里面:

另外有个比较容易忽略的一个问题就是:

当然不是,只有调用了start()方法才能启动一个线程,这就涉及到了线程的生命周期了,之后会对其进行专门学习,这个可能都知道,但是比较容易忽略它,顺便提一下。

再回来解决一开始要解决的场景问题:模拟读数据库的过程中,同时要写一些磁盘信息

/**
* 基础巩固----线程创建及启动
* 场景:模拟读数据库的过程中,同时要写一些磁盘信息
*/
public class TryConcurrency { public static void main(String[] args) {
new Thread("Read-Thread") {
@Override
public void run() {
readFromDataBase();
}
}.start();
new Thread("Write-Thread") {
@Override
public void run() {
writeDataToFile();
}
}.start();
//为了能在jcosole中同时看到main线程,这里做一定的休眠,省得退出看不到了
try {
Thread.sleep(2000 * 20);
} catch (InterruptedException e) {
e.printStackTrace();
}
} //读数据库
private static void readFromDataBase() {
//read data from database and handle it.
try {
println("Begin read data from db.");
Thread.sleep(1000 * 30L);
println("Begin read data done and start handle it.");
} catch (InterruptedException e) {
e.printStackTrace();
} println("The data handle finish and successfully.");
} //写文件
private static void writeDataToFile() {
try {
println("Begin write data to file.");
Thread.sleep(2000 * 20L);
println("Write data done and start handle it.");
} catch (InterruptedException e) {
e.printStackTrace();
} println("The data handle finish and successfully.");
} private static void println(String message) {
System.out.println(message);
} }

编译运行时,看一下jconsole:

其结果如下:

最新文章

  1. RIDE -- Robot Framework setup
  2. MarkdownPad2 Pro v2.4.2.29969 专业中文破解版完美支持table表格语法
  3. HDU4010 (动态树)
  4. 【Spring】Spring框架之Struts2和Spring的优点
  5. C#------获取最后一个"/"字符后面的所有内容
  6. 从一个action地址获取信息
  7. M1: 创建UWP空项目
  8. Java 中的数组操作
  9. Android WebRTC 音视频开发总结(一)
  10. 【阿里云产品公测】离线归档OAS,在也不用备份担心空间了
  11. C#使用DataSet类、DataTable类、DataRow类、OleDbConnection类、OleDbDataAdapter类编写简单数据库应用
  12. graph driver-device mapper-01driver初始化
  13. Python 基础整理(未完)
  14. springboot从入门到精通
  15. Codeforces 706C - Hard problem - [DP]
  16. C# sapnco支持.net 4.5了,真是个意外的发现
  17. Apache Kafka系列(一) 起步
  18. Vue.js绑定内联样式
  19. 【java】详解JFrame结构的分层
  20. 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

热门文章

  1. 如何制作红蓝3d电影(详细教程)
  2. 【VS开发】文件共享内存2
  3. OpenGL.Qt551.问题
  4. vim版本更新
  5. servlet获取checkbox的值出现选中的值为on。问题所在。。。
  6. MQ解决消息重发--做到幂等性
  7. C# U盘扫描
  8. # localhost 、217.0.0.1 、本机IP
  9. 宝塔面板liunx开启ssl域名后无法访问解决方法
  10. 微信小程序 路由跳转 异步请求 存储数据,微信登录接口