对于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:

其结果如下:

java线程基础巩固---创建并启动线程的更多相关文章

  1. java线程 — 创建和启动线程

    创建和启动线程,传统有两种方式: 方式1:继承Thread类: 方式2:实现Runnable接口: 线程类(java.lang.Thread):Thread类和Thread的子类才能称之为线程类.阅读 ...

  2. Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理

    一.前言 大家在面试过程中,必不可少的问题是线程池,小编也是在面试中被问啥傻了,JUC就了解的不多.加上做系统时,很少遇到,自己也是一知半解,最近看了尚硅谷阳哥的课,恍然大悟,特写此文章记录一下!如果 ...

  3. android 避免线程的重复创建(HandlerThread、线程池)

    最近在android开发中,用到都是new Thread(){...}.start()这种方式.本来这样是可以,但是最近突然爆出Performing stop of activity that is ...

  4. day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁

    一.线程     1.进程:资源的分配单位    线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...

  5. Java并发基础08. 造成HashMap非线程安全的原因

    在前面我的一篇总结(6. 线程范围内共享数据)文章中提到,为了数据能在线程范围内使用,我用了 HashMap 来存储不同线程中的数据,key 为当前线程,value 为当前线程中的数据.我取的时候根据 ...

  6. 主线程用afxBeginThread()创建多个线程安全退出的办法

    HANDLE hand[]; CCriticalSection m_crisecoin; CEvent m_event; struct Student { int nNO; int nYear; CW ...

  7. Android 线程池系列教程(4) 启动线程池中的线程和中止池中线程

    Running Code on a Thread Pool Thread 上一课   下一课 1.This lesson teaches you to Run a Runnable on a Thre ...

  8. java多线程基础(synchronize关键字)

    [toc] 基础知识 ---- 线程:进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元. 线程:进程中所包含的一个或多个执行单元称为线程(threa ...

  9. Java并发1——线程创建、启动、生命周期与线程控制

    内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...

随机推荐

  1. 《精通并发与Netty》学习笔记(09 - Java中流的概念)

    Java中流的概念 java程序通过流来完成输入/输出.流是生产或消费信息的抽象.流通过java的输入/输出与物理设备链接.尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式.这样,相同的输 ...

  2. 找到数组中频次大于1/k的数

    Majority Number III 给定一个数组(长度为L),找到所有出现频次大于1/k的数字. 我们主要使用摩尔投票法(Voting Algorithm)结合Map的数据结构解决此问题.其时间复 ...

  3. L1不可导的时候该怎么办

    坐标轴下降法 比较浅显的解释: 坐标轴下降法(解决L1正则化不可导的问题) 以代码进行简单入门的博客(演示的代价函数是可导的): Coordinate descent in Python Introd ...

  4. Qt——鼠标拖动缩放窗口源码

    #ifndef MOVEWIDGET_H #define MOVEWIDGET_H #include <QWidget> #include <QEvent> class Mov ...

  5. Coloring Edges 【拓扑判环】

    题目链接:https://vjudge.net/contest/330119#problem/A 题目大意: 1.给出一张有向图,给该图涂色,要求同一个环里的边不可以全部都为同一种颜色.问最少需要多少 ...

  6. 《The C Programming Language》学习笔记

    第五章:指针和数组 单目运算符的优先级均为2,且结合方向为自右向左. *ip++; // 将指针ip的值加1,然后获取指针ip所指向的数据的值 (*ip)++; // 将指针ip所指向的数据的值加1 ...

  7. 《MIT 6.828 Lab 1 Exercise 2》实验报告

    本实验链接:mit 6.828 lab1 Exercise2. 题目 Exercise 2. Use GDB's si (Step Instruction) command to trace into ...

  8. #【Python】【demo实验23】【练习实例】【 三人比赛顺序问题 】

    原题: 两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单. 我的 ...

  9. HanLP-地名识别调试方法

    HanLP收词特别是实体比较多,因此特别容易造成误识别.下边举几个地名误识别的例子,需要指出的是,后边的机构名识别也以地名识别为基础,因此,如果地名识别不准确,也会导致机构名识别不准确. 类型1 数字 ...

  10. IPv4

    1.IPv4分类地址 PC0(192.168.0.1) 和PC1(172.168.0.1)如果要ping通的话需要设置各自网关 PC0  设置IP  和  默认网关=路由器设置IP 2.Gigabit ...