Java多线程
文章平均质量分 78
Java多线程
CodingALife
这个作者很懒,什么都没留下…
展开
-
Java线程基础(19): 静态变量、实例变量、局部变量
java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说:写道给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被多个线程安全调用时就是线程安全的”。1、静态变量:线程非安全。静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。2、实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。实例变量为对象实例私有,在虚拟..原创 2021-03-14 23:30:21 · 310 阅读 · 0 评论 -
java的服务是每收到一个请求就新开一个线程来处理吗 tomcat呢
1、据说服务有两种:收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞 收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞。2、那么,问题来啦:java的服务是属于那种形式呢,怎么区分? 比如tomcat又是属于哪种呢?首先,服务器的实现不止有这两种方式。3、服务器模型:1、单线程模型:收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞这个是单线程模型,无法并发,一个请求没处理完服务器就会阻塞,不会处理下一个请求。一般的服务器不会使用.原创 2021-02-19 23:36:51 · 5295 阅读 · 1 评论 -
Java线程基础(4): 关于线程状态
Java线程有6种状态。在某个给定时间点上,一个线程只能处于这6种状态中的一种。线程状态的枚举:Thread.State这6种状态被明确地定义在Thread类的一个内部枚举类Thread.State中:它们是: NEW(新建) 一个尚未启动的线程处于这一状态。(A thread that has not yet started is in this state.) RUNNABLE(可运行) 一个正在 Java 虚拟机中执行的线程处于这一状态。...转载 2020-12-06 17:37:57 · 324 阅读 · 0 评论 -
还原进程和线程
我们平常说的进程和线程更多的是基于编程语言的角度来说的,那么你真的了解什么是线程和进程吗?那么我们就从操作系统的角度来了解一下什么是进程和线程。进程操作系统中最核心的概念就是进程,进程是对正在运行中的程序的一个抽象。操作系统的其他所有内容都是围绕着进程展开的。进程是操作系统提供的最古老也是最重要的概念之一。即使可以使用的 CPU 只有一个,但它们也支持(伪)并发操作。它们会将一个单独的 CPU 变换为多个虚拟机的 CPU。没有进程的抽象,现代操作系统将不复存在。所有现代的计算机会在同一时刻做很.转载 2020-12-06 16:52:44 · 127 阅读 · 0 评论 -
Java线程基础(0): 进程和线程
写给大忙人看的进程和线程我们平常说的进程和线程更多的是基于编程语言的角度来说的,那么你真的了解什么是线程和进程吗?那么我们就从操作系统的角度来了解一下什么是进程和线程。进程操作系统中最核心的概念就是进程,进程是对正在运行中的程序的一个抽象。操作系统的其他所有内容都是围绕着进程展开的。进程是操作系统提供的最古老也是最重要的概念之一。即使可以使用的 CPU 只有一个,它们也支持(伪)并发操作。它们会将一个单独的 CPU 抽象为多个虚拟机的 CPU。可以说:没有进程的抽象,现代操作系统将不复存在.转载 2020-12-06 17:01:40 · 210 阅读 · 0 评论 -
Java线程基础(2): JAVA多线程实现的四种方式
Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。1、继承Thread类创建线程Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start(.转载 2020-07-23 00:32:25 · 171 阅读 · 0 评论 -
Java线程基础(5): 线程状态之 Runnable
在上一篇我们粗略谈到了 Java 的6种线程状态,并对其中较为简单的 NEW 和 TERMINATED 做了分析,现在我们具体来看下 State.RUNNABLE状态,即所谓的可运行状态。(以下简称 runnable)再次强调,这里谈论的是Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:什么是 RUNNABLE?直接看它的 Javadoc.转载 2020-12-06 18:01:52 · 3719 阅读 · 0 评论 -
Java线程基础(6):Java 线程状态之 BLOCKED
在上一篇章中,我们强调了 BLOCKED 状态跟 I/O 的阻塞是不同的,它不是一般意义上的阻塞,而是特指被 synchronized 块阻塞,即是跟线程同步有关的一个状态。BLOCKED 状态的定义前面已经说过 BLOCKED(阻塞) 的简单定义为:一个正在阻塞等待一个监视器锁的线程处于这一状态。(A thread that is blocked waiting for a monitor lock is in this state.)更加详细的定义可以参考 Thread.State转载 2020-12-06 18:57:36 · 567 阅读 · 0 评论 -
Java线程基础(7): Java 线程状态之 WAITING
在上一篇里我们讲了一个重要状态:BLOCKED,在这一篇章里,我们来看另一个重要的状态:WAITING(等待)。定义一个正在无限期等待另一个线程执行一个特别的动作的线程处于这一状态。A thread that is waiting indefinitely for another thread to perform a particular action is in this state.然而这里并没有详细说明这个“特别的动作”到底是什么,详细定义还是看 javadoc(jdk8):转载 2020-12-06 18:58:28 · 791 阅读 · 0 评论 -
Java线程基础(9): 线程池Executors1
1、池介绍自JDK5之后,Java推出了一个并发包,java.util.concurrent,在Java开发中,我们接触到了好多池的技术,String类的对象池、Integer的共享池、连接数据库的连接池、Struts1.3的对象池等等,池的最终目的都是节约资源,以更小的开销做更多的事情,从而提高性能。2、线程池创建 我们的web项目都是部署在服务器上,浏览器端的每一个request就是一个线程,那么服务器需要并发的处理多个请求,就需要线程池技术,下面来看一下Java并发包下如何创...转载 2021-07-22 00:09:42 · 596 阅读 · 0 评论 -
Java线程基础(16): interrupt()
1、线程中断三个方法interrupt()中断线程。interrupted()测试当前线程是否已经中断。isInterrupted()测试线程是否已经中断。interrupt()方法用于中断线程,通常的理解来看,只要某个线程启动后,调用了该方法,则该线程不能继续执行了,来看个小例子:public class InterruptTest { public static void main(String[] args) throws InterruptedException {...转载 2021-07-21 22:58:38 · 309 阅读 · 0 评论 -
Java线程基础(17): 生产者/消费者问题
1、生产者/消费者还需要线程与线程协作(通信),生产者/消费者问题是一个经典的线程同步以及通信的案例。该问题描述了两个共享固定大小缓冲区的线程,即所谓的“生产者”和“消费者”在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候转载 2021-07-21 22:44:17 · 674 阅读 · 0 评论 -
Java线程基础(12): Java多线程执行顺序
1、知识点1、在单CPU计算机中,CPU是无法被多个程序并行使用的。2、操作系统中存在一种调度器,它可以负责拆分CPU为一段段时间的运行片,轮流分配给不同的进程。3、程序的运行不仅仅需要CPU,还需要很多其他资源,如内存啊,显卡啊,GPS啊,磁盘等等,这些统称为程序的执行环境,也就是程序上下文。4、多个程序没办法同一个时间共享CPU,那怎么办呢?这个时候比进程更小的线程就出来了,通过在不同线程的切换来达到共享CPU、共享程序上下文的目的。5、大家都知道,CPU有单核和多核区别,单核CPU原创 2021-07-21 03:16:40 · 1348 阅读 · 0 评论 -
Java线程基础(14): join()
Java中如何让多线程按照自己指定的顺序执行?这个问题最简单的回答是通过Thread.join来实现,久而久之就让很多人误以为Thread.join是用来保证线程的顺序性的。1、join()的使用场景 在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程将可能早于子线程结束。如果主线程需要知道子线程的执行结果时,就需要等待子线程执行结束了。主线程可以sleep(xx),但这样的xx时间不好确定,因为子线程的执行时间不确定,join()方法比较合适这个场景。...原创 2021-07-21 03:11:12 · 1113 阅读 · 0 评论 -
Java线程基础(13):wait()和notify()
简介 本文讲解Java中wait()、notify(),通过一个标准的使用实例,来讨论下这两个方法的作用和使用时注意点,这两个方法被提取到顶级父类Object对象中,地位等同于toString()方法。一、wait()和notify()含义wait()方法是让当前线程等待的,即让线程释放了对共享对象的锁,不再继续向下执行。wait(long timeout)方法可以指定一个超时时间,过了这个时间如果没有被notify()唤醒,则函数还是会返回。如果传递一个负数timeout会抛出I...原创 2021-07-21 02:52:27 · 11822 阅读 · 2 评论 -
Java线程基础(15): yield()、Sleep()
1、yield和sleep方法Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进入TIMED_WAITING状态,但不释放对象锁,millis后线程自动苏醒进入就绪状态。作用:给其它线程执行机会的最佳方式。 Thread.yield(),一定是当前线程调用此方法,当前线程放弃获取的CPU时间片,但不释放锁资源,由运行状态变为就绪状态,让OS再次选择线程。作用:让相同优先级的线程轮流执行,但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的,因为让步的原创 2021-07-20 22:37:12 · 1253 阅读 · 0 评论 -
Java多线程(1)多线程访问成员变量与局部变量
1、多线程访问成员变量与局部变量说明1、java多线程调用 单例类中一个的方法是不会排队的因为jvm 在每个线程下,都有一份 对调用方法的引用。2、多个线程调用的同一个对象的同一个方法:如果方法里无成员变量,不受任何影响; 如果方法里有成员变量,只有读操作,不受影响,存在赋值操作,有影响3、多线程调用同一个方法,局部变量会共享吗?局部变量不会受多线程影响; 成员变量会受到多线程影响jvm每个线程都拥有一个方法调用栈,用于跟踪线程中运行的一系列方法调用过程, 栈中的每个元素成为栈帧,原创 2021-07-19 22:38:32 · 5699 阅读 · 1 评论 -
Java回调机制
1、回调即我调用你的函数,你调用我的函数。通俗讲是类A的函数a()调用类B的函数b(),当类B的b()函数的执行时又去调用类A里的函数。是一种双向的调用方式。一般情况下,回调分两种,分别是同步回调和异步回调。...原创 2021-06-14 13:17:33 · 470 阅读 · 0 评论 -
Java线程基础(10): 线程池Executors2
本文首发于此博主:威威喵|博客主页:https://blog.csdn.net/smile_running在应用开发中,通常有这样的需求,就是并发下载文件操作,比如百度网盘下载文件、腾讯视频下载视频等,都可以同时下载好几个文件,这就是并发下载。并发下载处理肯定是多线程操作,而大量的创建线程,势必会影响程序的性能,导致卡顿等问题。所以呢,Java 中给我们提供了线程池来管理线程。首先,我们来看看线程池是什么?顾名思义,好比一个存放线程的池子,我们可以联想水池。线程池意味着...转载 2021-04-05 22:46:56 · 317 阅读 · 0 评论 -
Java线程基础(18): 多线程访问冲突
注意‘当使用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失。因此需要采用同步机制来解决这种问题。第一种 同步方法、同步代码块(synchronized)第二种 使用特殊成员变量(volatile 成员变量)实现线程同步(前提是对成员变量的操作是原子操作)第三种 使用线程局部变量(thread-local)解决多线程对同一变量的访问冲突,但不能实现同步(ThreadLocal类)第四种 使用Lock接口(ja...转载 2021-04-05 21:38:49 · 880 阅读 · 0 评论 -
Java 中如何模拟真正的同时并发请求?
有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了。java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了。但是,这种请求,一般会存在启动的先后顺序了,算不得真正的同时并发!怎么样才能做到真正的同时并发呢?是本文想说的点,java中提供了闭锁 CountDownLatch, 刚好就用来做这种事就最合适了。只需要: 开启n个线程,加一个闭锁,开启所有线程; 待所有线程都准备好后,按下开启按钮,就可以真正的发...转载 2021-04-05 20:51:55 · 304 阅读 · 0 评论 -
Java线程基础(1): Java线程详解
20210405未学原文:https://blog.csdn.net/kwame211/article/details/78963044转载 2021-04-05 16:32:00 · 142 阅读 · 0 评论 -
Java线程基础(11): 线程间通信
0 本文涉及到的知识点:正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。 thread.join(), object.wait(), object.notify(), CountdownLatch, CyclicBarrier, FutureTask, Callable 。 下面我从几个例子作为切入点来讲解下 Java 里有哪些方法来实现线程间通...转载 2021-04-05 11:26:54 · 796 阅读 · 0 评论 -
Java线程基础(8): Java 线程状态之 TIMED_WAITING
在上一篇章中我们谈论了 WAITING 状态,在这一篇章里,我们来看剩余的最后的一个状态:TIMED_WAITING(限时等待)。定义一个正在限时等待另一个线程执行一个动作的线程处于这一状态。A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.更详细的定义还是看 javadoc(jdk8):带指定的等转载 2021-01-21 16:15:41 · 1016 阅读 · 0 评论 -
Java线程基础(3): 线程六种状态及切换
Java中线程的状态分为6种。1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。3.阻塞(BLOCKE...转载 2020-12-06 17:39:12 · 1145 阅读 · 0 评论