并发编程的艺术——chap1
原文链接:https://blog.csdn.net/ftell/article/details/79353571#1 线程概念
文章目录
- 1 线程概念
- 2 创建任务和线程
- 3 Thread 类
1 线程概念
Java为创建和运行线程以及锁定资源以防止冲突提供了非常好的支持。你可以在程序中创建额外的线程以执行并发任务。在Java中,每个任务都是Runnable接口的实例,也称为一个runnable对象。一个线程实质上是一个对象,它为任务的执行提供便利。
public class TaskClass implements Runnable {public TaskClass(...) {}// 实现Runnable中的run方法public void run() {// 告诉系统如何运行自定义线程}
}public class Client {public void someMethod() {// 创建TaskClass的实例TaskClass task = new TaskClass(...);// 创建线程Thread thread = new Thread(task);// 启动线程thread.start();}
}
2 创建任务和线程
task类必须实现 Runnable接口,task必须从线程执行。
task是对象,为了创建task,必须首先为task定义一个实现了Runnable接口的类。Runnable接口相当简单,只包含了一个Run方法。
task必须在线程中执行,Thread类含有用于创建线程的构造函数,以及很多用于控制线程的方法,创建task的线程:
Thread thread = new Thread(task);
然后调用start()方法告诉JVM,线程已经可以运行:
thread.start();
JVM 通过调用task的run()方法执行task. 下面的例子,创建3个线程,分别打印’a’ 100 次,打印’b’ 100 次, 以及打印 0 ~ 100 之间的整数:
public class TaskThreadDemo {public static void main(String[] args) {// 创建taskRunnable printA = new PrintChar('a', 100); // Runnable 改成 PrintChar 也可以Runnable printB = new PrintChar('b', 100); // Runnable 改成 PrintChar 也可以Runnable print100 = new PrintNum(100); // Runnable 改成 PrintNum 也可以// 创建线程Thread thread1 = new Thread(printA);Thread thread2 = new Thread(printB);Thread thread3 = new Thread(print100);// 启动线程thread1.start();thread2.start();thread3.start();}
}// 打印指定次数字符的 taskclass PrintChar implements Runnable {private char charToPrint; // The character to printprivate int times; // The number of times to repeat/** Construct a task with a specified character and number of* times to print the character*/public PrintChar(char c, int t) {charToPrint = c;times = t;}@Override /** Override the run() method to tell the system* what task to perform*/public void run() {for (int i = 0; i < times; i++) {System.out.print(charToPrint);}}
}// The task class for printing numbers from 1 to n for a given n
class PrintNum implements Runnable {private int lastNum;/** Construct a task for printing 1, 2, ..., n */public PrintNum(int n) {lastNum = n;}@Override /** Tell the thread how to run */public void run() {for (int i = 1; i <= lastNum; i++) {System.out.print(" " + i);}}
}
3 Thread 类
Thread 类包含了创建线程的构造函数以及控制线程的方法
Thread 类实现接口 Runnable:
<< interface >>
java.lang.Thread -> java.lang.Runnable
因为Thread实现Runnable,因此可以定义类继承Thread并实现Run方法:
// 自定义thread类
public class CustomThread extends Thread {public CustomThread(...) {}// 重写Runnable里的run方法public void run() {// 告诉系统如何执行这个task}
}// 自定义类
public class Client {public void someMethod() {// 创建一个线程CustomThread thread1 = new CustomThread(...);// 启动线程thread1.start();// 创建另一个线程CustomThread thread2 = new CustomThread(...);// 启动线程thread2.start();}
}
例子:并行和串行
//package chapter01;/*** 并发和单线程执行测试* * @author tengfei.fangtf* @version $Id: ConcurrencyTest.java, v 0.1 2014-7-18 下午10:03:31 tengfei.fangtf Exp $*/
public class newtest {/** 执行次数 */private static final long count = 40000l;public static void main(String[] args) throws InterruptedException {//并发计算concurrency();//单线程计算serial();}private static void concurrency() throws InterruptedException {long start = System.currentTimeMillis();Thread thread = new Thread(new Runnable() {@Overridepublic void run() {int a = 0;for (long i = 0; i < count; i++) {a += 5;}System.out.println(a);}});thread.start(); //启动线程int b = 0;for (long i = 0; i < count; i++) {b--;}thread.join();long time = System.currentTimeMillis() - start;System.out.println("concurrency :" + time + "ms,b=" + b);}private static void serial() {long start = System.currentTimeMillis();int a = 0;for (long i = 0; i < count; i++) {a += 5;}int b = 0;for (long i = 0; i < count; i++) {b--;}long time = System.currentTimeMillis() - start;System.out.println("serial:" + time + "ms,b=" + b + ",a=" + a);}}
并发编程的艺术——chap1相关推荐
- java 并发 mobi_Java并发编程的艺术pdf txt mobi下载及读书笔记
Java并发编程的艺术pdf txt mobi读书笔记 如何解决资源限制的问题:对于软件资源限制,可以考虑使用资源池将资源复用.比如使用连接池将数据库和Socket连接复用,或者在调用对方webser ...
- Java并发编程的艺术 记录(一)
模拟死锁 package com.gjjun.concurrent;/*** 模拟死锁,来源于<Java并发编程的艺术>* @Author gjjun* @Create 2018/8/12 ...
- Java并发编程的艺术,解读并发编程的优缺点
并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...
- 多线程知识梳理(2) - 并发编程的艺术笔记
layout: post title: <Java并发编程的艺术>笔记 categories: Java excerpt: The Art of Java Concurrency Prog ...
- 《Java并发编程的艺术》笔记
<Java并发编程的艺术>笔记 第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种 ...
- 《Java并发编程的艺术》——线程(笔记)
文章目录 四.Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 4.1.2 为什么要使用多线程 4.1.3 线程优先级 4.1.4 线程的状态 4.1.5 Daemon线程 4.2 启动 ...
- 并发编程的艺术 读书笔记
第一章 并发编程的挑战 1. 单核CPU分配运行时间给各个线程,实现多线程执行代码. 举例:看英文书时某个单词不会,先记住看到书的页数和行数,然后去查单词,查完回到看书状态,相当于上下文切换. 2. ...
- 《Java 并发编程的艺术》迷你书
本文源自InfoQ发表的<Java 并发编程的艺术>电子书 作者:方腾飞 序言:张龙 免费下载此迷你书 推荐序 欣闻腾飞兄弟的<聊聊并发>系列文章将要集结成InfoQ迷你书 ...
- 【推荐】《Java 并发编程的艺术》迷你书
本文源自InfoQ发表的<Java 并发编程的艺术>电子书 作者:方腾飞 序言:张龙 免费下载此迷你书 推荐序 欣闻腾飞兄弟的<聊聊并发>系列文章将要集结成InfoQ迷你书 ...
- Java并发编程的艺术(一)
看<java并发编程的艺术>这本书,想着看的时候做个简单的总结,方便以后直接看重点. 一.并发编程的挑战 1.上下文切换 Cpu时间片通过给每个线程分配CPU时间片来实现多线程机制,时间片 ...
最新文章
- SQL Server 2008 缩小数据库日志
- mac下appium启动
- 思科模拟器-虚拟局域网的划分与配置实验
- 【完结】AI1000问以后知识星球和B站见啦
- html如何让条数按序号输出,JS 怎么控制页面序号较智能的生成?
- Springboot 常见请求方式
- javascript瀑布流效果
- 自旋锁和互斥锁实例_多线程编程之自旋锁
- python几个版本的区别-Python的这几个版本不同
- 删除Github上项目
- HTML5对表单的约束验证
- 空巢青年,“空巢”是选择还是无奈? | 数据告诉你
- 低通滤波器的设计与DSP实现
- LeetCode题解:707.设计链表
- 刘宇凡:海子,一个孤独的灵魂诗人
- 马云马总,我祝福您全家和以后的子子孙孙都有996福报
- 分布式操作系统 - 1.分布式系统概论
- [1927-2011][影片][历届奥斯卡最佳影片合集][全82部]
- Gateway一文详解
- STM32CubeMX快速生成STM32F407ZG芯片寄存器初始化
热门文章
- 怎么在服务器跑sql文件,服务器mysql数据库如何运行脚本
- angularjs sill 创建项目_AngularJS快速上手,从安装到运行
- 多元统计分析最短距离法_多元统计分析习题及解答.doc
- 华为算法精英赛(题1:判断输入天数为当年的第几天)
- Twitter数据非API采集方法
- carto笔记--- 传感器数据走向
- KMP模式匹配的next数组
- 人工智能+眼科疾病辅助诊断(相关信息搜集)
- 1030 Travel Plan [Dijkstra]
- mongo之$group+$addToSet