从这一篇开始写Java并发编程实例,内容都翻译整理自书籍:《Java 7 Concurrency Cookbook》

谈到线程,无法逃避的一个问题就是:

并发(concurrency)和并行(parallellism)区别:

解释一:并发是指两个或多个事件在同一时间间隔发生;并行是指两个或者多个事件在同一时刻发生;

解释二:并发是多个任务在一台处理器上“同时”处理;并行是在多台处理器(或多核心CPU)上同时处理多个任务;

解释三:并发是多个线程无序执行;并行是使用多个线程按一定顺序执行以简化处理某一问题;

    

所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

Java中有2种方式创建并运行一个线程

1.继承Thread类并重写run()方法

2.创建一个线程类实现Runnable接口,然后创建一个线程类对象。

这个例子中,我们采用第二种方案,创建并运行10个线程。每个线程打印1-10之间乘法表。

package com.dylan.thread;

/**
* @author xusucheng
* @create 2018-04-11
**/
public class Calculator implements Runnable {
private int number; public Calculator(int number) {
this.number = number;
} @Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.printf("%s: %d * %d = %d\n", Thread.
currentThread().getName(), number, i, i * number);
}
} public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
Calculator calculator = new Calculator(i);
Thread thread = new Thread(calculator);
thread.start();
}
}
}

输出(每次运行结果不一样):

Thread-0: 1 * 1 = 1
Thread-9: 10 * 1 = 10
Thread-8: 9 * 1 = 9
Thread-8: 9 * 2 = 18
Thread-7: 8 * 1 = 8
Thread-7: 8 * 2 = 16
Thread-7: 8 * 3 = 24
Thread-6: 7 * 1 = 7
Thread-6: 7 * 2 = 14
Thread-5: 6 * 1 = 6
Thread-4: 5 * 1 = 5
Thread-4: 5 * 2 = 10
Thread-4: 5 * 3 = 15
Thread-4: 5 * 4 = 20
Thread-4: 5 * 5 = 25
Thread-4: 5 * 6 = 30
Thread-4: 5 * 7 = 35
Thread-4: 5 * 8 = 40
Thread-4: 5 * 9 = 45
Thread-4: 5 * 10 = 50
Thread-3: 4 * 1 = 4
Thread-2: 3 * 1 = 3
Thread-2: 3 * 2 = 6
Thread-2: 3 * 3 = 9
Thread-2: 3 * 4 = 12
Thread-1: 2 * 1 = 2
Thread-2: 3 * 5 = 15
Thread-3: 4 * 2 = 8
Thread-3: 4 * 3 = 12
Thread-3: 4 * 4 = 16
Thread-3: 4 * 5 = 20
Thread-3: 4 * 6 = 24
Thread-3: 4 * 7 = 28
Thread-3: 4 * 8 = 32
Thread-3: 4 * 9 = 36
Thread-3: 4 * 10 = 40
Thread-5: 6 * 2 = 12
Thread-6: 7 * 3 = 21
Thread-6: 7 * 4 = 28
Thread-6: 7 * 5 = 35
Thread-6: 7 * 6 = 42
Thread-6: 7 * 7 = 49
Thread-6: 7 * 8 = 56
Thread-6: 7 * 9 = 63
Thread-6: 7 * 10 = 70
Thread-7: 8 * 4 = 32
Thread-7: 8 * 5 = 40
Thread-7: 8 * 6 = 48
Thread-7: 8 * 7 = 56
Thread-7: 8 * 8 = 64
Thread-7: 8 * 9 = 72
Thread-7: 8 * 10 = 80
Thread-8: 9 * 3 = 27
Thread-9: 10 * 2 = 20
Thread-0: 1 * 2 = 2
Thread-0: 1 * 3 = 3
Thread-0: 1 * 4 = 4
Thread-9: 10 * 3 = 30
Thread-9: 10 * 4 = 40
Thread-9: 10 * 5 = 50
Thread-9: 10 * 6 = 60
Thread-8: 9 * 4 = 36
Thread-8: 9 * 5 = 45
Thread-8: 9 * 6 = 54
Thread-8: 9 * 7 = 63
Thread-5: 6 * 3 = 18
Thread-2: 3 * 6 = 18
Thread-2: 3 * 7 = 21
Thread-1: 2 * 2 = 4
Thread-1: 2 * 3 = 6
Thread-1: 2 * 4 = 8
Thread-2: 3 * 8 = 24
Thread-2: 3 * 9 = 27
Thread-5: 6 * 4 = 24
Thread-8: 9 * 8 = 72
Thread-8: 9 * 9 = 81
Thread-8: 9 * 10 = 90
Thread-9: 10 * 7 = 70
Thread-0: 1 * 5 = 5
Thread-9: 10 * 8 = 80
Thread-9: 10 * 9 = 90
Thread-5: 6 * 5 = 30
Thread-5: 6 * 6 = 36
Thread-2: 3 * 10 = 30
Thread-1: 2 * 5 = 10
Thread-5: 6 * 7 = 42
Thread-5: 6 * 8 = 48
Thread-5: 6 * 9 = 54
Thread-5: 6 * 10 = 60
Thread-9: 10 * 10 = 100
Thread-0: 1 * 6 = 6
Thread-0: 1 * 7 = 7
Thread-0: 1 * 8 = 8
Thread-1: 2 * 6 = 12
Thread-1: 2 * 7 = 14
Thread-1: 2 * 8 = 16
Thread-1: 2 * 9 = 18
Thread-1: 2 * 10 = 20
Thread-0: 1 * 9 = 9
Thread-0: 1 * 10 = 10

Java并发编程实例--1.创建和运行一个线程的更多相关文章

  1. Java并发编程:如何创建线程?

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  2. 2、Java并发编程:如何创建线程

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  3. 【转】Java并发编程:如何创建线程?

    一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认是java.exe或者javaw.exe(windows下可以通过 ...

  4. Java并发编程原理与实战八:产生线程安全性问题原因(javap字节码分析)

    前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析. 一.问题引出 先看一段代码 packa ...

  5. Java并发编程(一):进程和线程之由来

    转自:http://www.cnblogs.com/dolphin0520/p/3910667.html 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当 ...

  6. java并发编程JUC第十篇:CyclicBarrier线程同步

    在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...

  7. [Java 并发] Java并发编程实践 思维导图 - 第二章 线程安全性

    依据<Java并发编程实践>一书整理的思维导图.

  8. Java并发编程原理与实战二十一:线程通信wait&notify&join

    wait和notify wait和notify可以实现线程之间的通信,当一个线程执行不满足条件时可以调用wait方法将线程置为等待状态,当另一个线程执行到等待线程可以执行的条件时,调用notify可以 ...

  9. Java 并发编程(四):如何保证对象的线程安全性

    01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合 ...

  10. Java并发编程:如何创建进程?

    转载自:http://www.cnblogs.com/dolphin0520/p/3913517.html 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程 ...

随机推荐

  1. 【Mysql系列】(一)MySQL语句执行流程

    首发博客地址 首发博客地址 系列文章地址 参考文章 MySQL 逻辑架构 连接器 连接命令一般是这么写的 mysql -h$ip -P$port -u$user -p 那么 什么是连接器? MySQL ...

  2. [转帖]一图胜千言 -- SQL Server 基准测试

    https://blog.51cto.com/ultrasql/2130487 文章标签基准测试文章分类SQL Server数据库阅读数1116  

  3. [转帖]git常用命令

    https://www.cnblogs.com/xingmuxin/p/11416870.html GitHub可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Goog ...

  4. [转帖]linux块I/O总体概括

    直接先上重点,linux中IO栈的完全图如下: 系统中能够随机访问固定大小数据片的硬件设备称作块设备.固定大小的数据片称为块.常见的块设备就是硬盘了.不能随机访问的就是字符设备了,管理块设备比字符设备 ...

  5. [转帖]-O1,-O2,-O3编译优化知多少

    1.从.c文件到可执行文件,其间经历了几步? 高级语言是偏向人,按照人的思维方式设计的,机器对这些可是莫名奇妙,不知所谓.那从高级语言是如何过渡到机器语言的呢?这可是一个漫长的旅途呀! 其中,得经历这 ...

  6. [转帖]网络传输性能netperf测试方法和下载

    简介 Netperf是一种网络性能的测试工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式 ...

  7. 像elementui一样封装自定义按钮

    <template> <div> <button @click.prevent="coverHandler" class="btn-btn& ...

  8. ngnix在linux安装并设置反向代理

    一.nginx安装 1.安装Nginx依赖的环境 安装Nginx依赖的gcc的编译环境: yum install gcc-c++ Nginx的http模块需要使用pcre来解析正则表达式,需要安装pc ...

  9. 基于.Net Core3.1 MVC + EF Core的项目(一)框架的初步搭建

    项目暂时分为六大块,结构如图所示 代码地址是  https://github.com/hudean/VacantCloud-   里面有许多没有完成,不过一些大致的内容都写的差不多了,权限认证依赖注入 ...

  10. 加快ios的出包速度

    在导出ipa时,通过这几种方法,可以更快地导出ipa来进行测试 不勾选bitcode 在导出ipa时,不勾选bitcode,这样会加快出包的速度,但导出来的ipa会大一些,关于bitcode可查看:& ...