无论在我们的工作中还是在我们的生活中,我们都会用到多线程的知识,今天就给大家讲一下如何使用多线程。

序幕

线程的启动
如何使线程暂停
如何使线程停止
线程的优先级
线程安全相关的问题

我们首先要知道进程和线程分别是什么?

进程 - 进程是具有一定独立功能的程序(例如QQ.exe),关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。

线程 - 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位;线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。

多线程的优点
多线程从某方面来说等价于多任务,当你有多个任务要处理时,多个任务一起做所消耗的时间肯定比任务串行起来做,所消耗的时间短;

如图所示

多线程的使用

在Java的JDK包中,已经自带了对多线程技术的支持,可以非常方便地进行多线程的编程。实现多线程编程的方式主要有两种:

继承Thread类

实现Runnable接口

如图所示

Thread类实现了Runnable接口,它们之间具有多态关系。

Runnable接口类

@FunctionalInterface
public interface Runnable {public abstract void run();
}

Thread类主要源码:

public class Thread implements Runnable {public static native Thread currentThread();public static native void yield();public static native void sleep(long millis) throws InterruptedException;public static void sleep(long millis, int nanos) throws InterruptedException {// ...sleep(millis);}public Thread() {init(null, null, "Thread-" + nextThreadNum(), 0);}public Thread(Runnable target) {init(null, target, "Thread-" + nextThreadNum(), 0);}public Thread(ThreadGroup group, Runnable target) {init(group, target, "Thread-" + nextThreadNum(), 0);}public synchronized void start() {// ...start0(); // ...}private native void start0();@Deprecatedpublic final void stop() {// ...}public void interrupt() {// ...}public static boolean interrupted() {return currentThread().isInterrupted(true);}public boolean isInterrupted() {return isInterrupted(false);}private native boolean isInterrupted(boolean ClearInterrupted);public final native boolean isAlive();@Deprecatedpublic final void suspend() {checkAccess();suspend0();}@Deprecatedpublic final void resume() {checkAccess();resume0();}
}

这二种创建线程的方式有什么区别?
Java类是单继承的,而接口可以支持多继承,使用Thread类的方式创建新线程时,最大的局限就是不支持多继承。所以具体选择哪种方式来创建线程,就看你是不是需要具体多继承的特性。

Thread详解

看到Thread的源码,我们现在对其主要的的一些方法进行讲解一下
native关键字 - native是与C++联合开发的时候用的!使用native关键字说明这个方法是原生函数,也就是说这个方法是用C/C++语言实现的,并且被编译成dll相关组件,由java来调用。所以从上面的Thread类源代码中可以看到,有好多是调用了原生的函数。

构造方法 - Thread有一组构造方法,具体指定了线程名称(name)、线程组(ThreadGroup)、接口类(Runnable)、栈大小(stackSize)等参数 具体如下:

public Thread()
public Thread(Runnable target)
Thread(Runnable target, AccessControlContext acc)
public Thread(ThreadGroup group, Runnable target)
public Thread(String name)
public Thread(ThreadGroup group, String name)
public Thread(Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name, long stackSize)

isAlive() - 方法isAlive()是判断当前的线程是否处于活动状态。而这个活动状态指的是:线程已经启动且尚未终止,如正在运行,准备开始运行的状态,都认为线程是“存活”的。

sleep() - 在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。这个“正在执行的线程”是指this.currentThread()返回的线程。

getId() - 取得线程的唯一标识。每个线程在初始化的过程中都会调用nextThreadID方法获取到一个唯一标识。

private static long threadSeqNumber;
private static synchronized long nextThreadID() {return ++threadSeqNumber;
}

在一个进程中,线程的ID是唯一。

停止线程 - 停止线程是在多线程开始时很重要的技术点,而停止线程在Java中并不像break语句那样干脆,需要一些技巧性的处理。

在Java中有以下3种方法可以终止正在运行的线程。

1.使用退出标志,使线程正常退出,即当run方法完成后线程终止。

2.使用stop方法强行终止线程,但是不推荐使用该方法,因为stop和suspend及resume一样,都是作废过期的方法,使用它们可能产生不可预料的结果。

3.使用interrupt方法中断线程。

暂停线程 - 暂停线程意味着此线程还可以恢复运行。使用suspend()方法暂停线程,resume()方法恢复线程的执行。
yield - yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但是放弃的时间不确定,有可能刚放弃,马上又获得CPU时间片了。

线程优先级 - 在操作系统中,线程可以划分优先级,优先级较高的线程得到的CPU资料较多,也就是CPU优先执行优先级较高的线程对象中的任务。在Thread中,我们使用setPriority()方法设置优先级别。

java的线程优先级分为1~10这10个等级

public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;

线程优先级的三个特性

线程优先级具有继承特性, 比如A线程启动B线程,则B线程的优先级与A是一样的。

优先级具有规则性,虽然我们使用setPriority()方法设置了优先级,但是真正执行的过程中,不会保证优先级高的线程绝对比优先级低的线程优先完成。即CPU尽量将执行资源让给优先级比较高的线程。

*优先级具有随机性,具优先级较高的线程不一定每一次都先执行完。

守护线程 - 在Java线程中有两种线程,一种是用户线程,另一种是守护线程。
守护线程是一种特殊的线程,它的特性有“陪伴”的含义,当进程中不存在非守护线程了,则守护线程自动销毁。

典型的守护线程就是垃圾回收线程,当进程中没有非守护线程了,则垃圾回收线程则没有存在的必要了,自动销毁。

只要当前JVM实例中存在任何一个非守护线程没有结束,守护线程就在工作,只有当最后一个非守护线程结束时,守护线程才随着JVM一同结束工作。
通过调用Thread.setDaemon(true)设置是否为守护线程。

Java多线程的使用相关推荐

  1. Java 多线程的基本方式

    Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

  2. Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数

    Java多线程读取图片内容并返回 1. ExecutorService线程池 2. 效率截图 3. 源码 1. ExecutorService线程池 ExecutorService线程池,并可根据系统 ...

  3. Java多线程,Thread,Runnable,Callable Task,Future<Task>,CompletionService

    一.Java多线程的方法 1. 继承 Thread 2. 实现 Runnable 3. 实现 Callable 可以有返回值 package com.test;import java.util.Arr ...

  4. 【收藏】Java多线程/并发编程大合集

    (一).[Java并发编程]并发编程大合集-兰亭风雨    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [ ...

  5. 40个Java多线程问题总结

    (转) 这篇文章作者写的真是不错 40个问题汇总 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓"知其然知其所 ...

  6. Java多线程编程实战:模拟大量数据同步

    背景 最近对于 Java 多线程做了一段时间的学习,笔者一直认为,学习东西就是要应用到实际的业务需求中的.否则要么无法深入理解,要么硬生生地套用技术只是达到炫技的效果. 不过笔者仍旧认为自己对于多线程 ...

  7. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  8. Java多线程常见面试题及答案汇总1000道(春招+秋招+社招)

    Java多线程面试题以及答案整理[最新版]Java多线程高级面试题大全(2021版),发现网上很多Java多线程面试题都没有答案,所以花了很长时间搜集,本套Java多线程面试题大全,汇总了大量经典的J ...

  9. java多线程编程01---------基本概念

    一. java多线程编程基本概念--------基本概念 java多线程可以说是java基础中相对较难的部分,尤其是对于小白,次一系列文章的将会对多线程编程及其原理进行介绍,希望对正在多线程中碰壁的小 ...

  10. Java多线程的同步机制(synchronized)

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...

最新文章

  1. ((ios开发学习笔记九)) Simple TableView 实现(附 实例源码)
  2. 直接运行可执行文件linux终端一闪而过
  3. 干掉 GuavaCache:Caffeine 才是本地缓存的王
  4. 哈工大理论力学第八版电子版_理论力学哈工大第八版1第六章思考题课后题
  5. yjv是电缆还是电线_YJV与VV电缆的区别你知道吗?推荐
  6. linux下kafka与zookeeper集群部署
  7. Java EE陷阱#1:忽略@Singleton的默认锁定
  8. cocos2dx blender 骨骼动画实现
  9. 黑马Java学习笔记之-----集合框架
  10. TensorFlow笔记(8) LeNet-5卷积神经网络
  11. Open3d之多视角点云配准
  12. java字体除了宋体,为什么许多中文网站的主要字体仍然采用宋体而不是微软雅黑?...
  13. C语言商品超市管理系统课程设计,C语言课程设计超市信息管理系统.doc
  14. virtual box linux 安装增强功能,在linux系统中安装virtualbox增强功能(增强包)的详细步骤...
  15. N阶Butterworth滤波器的频率响应(Python实现)
  16. thermal 代码分析
  17. nokia5200中使用ucweb浏览器
  18. 维夏英语暑期调研小分队——第二天
  19. 如何设置excel中一部分表格显示但是不打印?
  20. 信息安全技术之08之设备与环境安全测试卷

热门文章

  1. python建模大赛算法_Python数据分析kaggle-Titanic+天池-工业蒸汽量预测建模算法
  2. Springboot的异步、定时、邮件任务
  3. vb.net html标签,VB.Net - 获取元素html的字符串/值?
  4. 如何修改matlab中的语句,求大神帮忙看一下这个语句怎么改!!!!!
  5. mysql linux导入csv主键,MySQL导入csv文件内容到Table及数据库的自增主键设置
  6. mysql修改数据库级别_设置数据库兼容级别的两种方法
  7. linux错误码61,Linux编程中的错误码列表
  8. MySQL高级 —— 查询性能优化
  9. Java反射————Method根据方法名称字符串调用方法
  10. 微型计算机硬件性能取决于什么,微型计算机硬件系统的性能主要取决于