《java多线程编程核心技术》(一)使用多线程
了解多线程
进程和多线程的概念和线程的优点:
提及多线程技术,不得不提及"进程"这个概念。百度百科对"进程"的解释如下:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
看起来可能比较抽象,如果我们打开任务管理器,那么"进程"就可以看成下面在操作系统中运行的exe程序。
所以进程是受操作系统管理的基本运行单元!
那什么是线程呢?
线程可以理解为在进程中独立运行的子任务。比如我们的QQ.exe运行时就有很多的子任务在同时运行,好友 视频线程、下载文件线程、发送表情线程。这些不同的任务或功能都能同时运行,每一项任务都可以理解为线程在工作。
那么这么使用多线程有什么优点呢?
多数人使用的都是“多任务操作系统”,那比如windows,那么其中的方便性大家应该都深有体会。使用多任务操作系统,可以最大限度的利用CPU的空闲时间来处理其他的任务,比如一边听音乐,一边编辑文档。CPU在这些任务之间不停的切换,由于切换的速度非常之快,给使用者的感觉这些任务似乎在同时运行。所以使用多线程技术后,可以在同一时间内运行更多不同种类的任务,提高CPU的使用率。
创建线程:
想学习一个技术我们必须使用它,现在先通过一个示例接触一下线程。
一个进程正在运行至少会有一个线程在运行,比如java中我们调用的public static void main()方法的创建的线程就是这样的,而且它是由JVM创建的。
public class MyFirstThread {
public static void main(String args[]){
System.out.println(Thread.currentThread().getName());
}
}
程序运行后结果:

控制台会输出一个名称为main的线程,正在执行main()方法的代码。
如何使用多线程?
在java的JDK开发包中,自带了对多线程的支持,可以方便的进行多线程编程。实现多线程编程的主要方式有两种。
一种是继续Thread类,另一种是实现Runnable接口。
在创建新的线程前,先别急,看一下Thread类的结构:
public class Thread implements Runnable
发现了吧,Thread实现了Runnable的接口,他们之间具有多态关系。
使用Thread类的方式创建新线程,最大的局限就是不支持多继承,因为java不支持多继承嘛。所以为了支持多继承,完全可以使用实现Runnable接口的方式。
总结一下,用这两种方式创建的线程在工作时性质时一样的,没有本质区别。
那么接下来先看第一种方法,需要继承Thread类并重写run方法:
继承Thread类
package MyThread;
public class Test01 {
public static void main(String args[]){
MyThread myThread=new MyThread();
myThread.start();
System.out.println("运行结束");
}
}
运行结果如下:
可以看到,MyThread中的run()方法运行较晚,所以在多线程技术里,代码的运行结果和代码的调用顺序是无关的。
线程是一个子任务,CPU以不确定的方式,或者说随机的方式来调用线程。所以出现了上面的情况,千万不要把代码顺序当成线程的执行的顺序!
实现Runnable接口
当要创建的线程类已经有父类的情况下,就无法再继承Thread类了,所以需要通过实现Runnable接口来应对这种情况。
那么我们就先创建一个实现了Runnable接口类如下:
package MyThread;
public class Myrunnable implements Runnable {
@Override
public void run(){
System.out.println("我是实现Runnable接口的线程");
}
}
至于怎么使用这个MyRunnable类 我们就需要根据Thread.java的构造函数。
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
public Thread(Runnable target, String name) {
init(null, target, name, 0);
}
其中有两个构造函数可以传递Runnable接口,说明构造函数支持传入Runnable接口对象。我们的测试类代码如下:
public class TestRunnable01 {
public static void main(String args[]) {
Runnable runnable = new Myrunnable();
Thread thread = new Thread(runnable);
thread.start();
System.out.println("运行结束");
}
}
结果如下:
第一节的内容主要是去了解多线程和基本的创建线程的两种方法。
参考书籍《Java多线程编程核心技术》
《java多线程编程核心技术》(一)使用多线程的更多相关文章
- Java多线程编程核心技术---单例模式与多线程
立即加载/饿汉模式 立即加载就是使用类的时候已经将对象创建完毕. public class MyObject { //立即加载方式==饿汉模式 private static MyObject myOb ...
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- Java多线程编程核心技术---对象及变量的并发访问(二)
数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...
- Java多线程编程核心技术
Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...
- 《Java多线程编程核心技术》推荐
写这篇博客主要是给猿友们推荐一本书<Java多线程编程核心技术>. 之所以要推荐它,主要因为这本书写得十分通俗易懂,以实例贯穿整本书,使得原本抽象的概念,理解起来不再抽象. 只要你有一点点 ...
- 《Java 多线程编程核心技术》- 笔记
作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...
- Thread.currentThread()和this的区别——《Java多线程编程核心技术》
前言:在阅读<Java多线程编程核心技术>过程中,对书中程序代码Thread.currentThread()与this的区别有点混淆,这里记录下来,加深印象与理解. 具体代码如下: pub ...
- Java多线程编程核心技术(三)多线程通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- Java多线程编程核心技术(二)对象及变量的并发访问
本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...
随机推荐
- EOS源码
[EOS源码] 1.在 libraries/chain/include/eosio/chain/ 目录下. permission_level 定义如下: account_name.permissi ...
- UniRX简述
UniRX:是一个Unit3D的编程框架,专注于解决异步逻辑,使得异步逻辑的实现更加简单优雅. 例如:实现“只处理第一次鼠标点击事件”: Observable.EveryUpdate() .Where ...
- 解决mysql设置时区时的错误Unknown or incorrect time zone: 'Asia/Shanghai'
Mysql默认时区格式是'+8:00'的格式,这个时区可以在my.ini中[mysqld]节点下设置 default-time-zone = '+8:00' 默认这个设置是没有的 但是mysql不支持 ...
- Beautiful Numbers(牛客网)
链接:https://ac.nowcoder.com/acm/problem/17385来源:牛客网 题目描述 NIBGNAUK is an odd boy and his taste is stra ...
- 变邻域搜索(Variable neighborhood search)
变邻域搜索(Variable neighborhood search)VNS是Hansen等提出的一种元启发近似算法,它通过在不同的邻域结构内跳转搜索, 能够避免陷入局部最优解. 算法主要分为两部分: ...
- [BZOJ2252]矩阵距离(BFS)
题意 输入矩阵m行n列(m<=500,n<=500),只含0.1,输出离每个元素距离最近的1的距离,其中距离定义为D(aij,akl)=abs(i-k)+abs(j-l). 示例: 输入: ...
- 【转载】【吵架】能力 说清自己的能力。表达清楚 ;别人发飙你也要撕b;换位思考,把自己当领导层
女上司和别人在会议室吵架,大家都说她变态.女人能当好领导吗? 治敏@为好优 2018-06-20 19:56:00 为好优姐姐: 想问问您,是不是职场女强人,都是那种彪悍的战斗机呀! 我刚来公司实习 ...
- spring aop做什么介绍
1.AOP(Aspect Orient Programming),称为面向切面编程,它作为面向对象(OOP)的一种补充,用于处理系统中分布于各个模板的横切关注点,比如事务管理.日志.缓存等.AOP实现 ...
- Centos7 出现Welcome to emergency mode!
做mount挂载时,修改了 /etc/fstab 文件,导致Centos7重启时出现如下图所示错误: Welcome to emergency mode! After logging in, typ ...
- 基于SoftRoCE 了解RDMA
RDMA是基于IB技术的内存直接传送,无需内核参与,硬件网卡搞定.IB需要HPC领域的专用硬件,ROCE则是RDMA协议在普通以太网卡的实现,RoCEv1是在MAC上的二层封装,局域网内可以,要通过路 ...