`

并发专题---并发基础概念

 
阅读更多
进程VS程序
--进程是执行程序的动态过程,而程序是进程运行的静态文本。
--一个进程可以执行一个或多个程序,反之,一个程序可以被多个进程调用。
--程序是指令码,而进程是一次执行过程。
--------------------------------------------
进程通常有3个部分组成:1.程序 ,2.数据集合 ,3进程控制块(ProcessControlBlock,PCB)。

进程的程序部分描述了进程所要完成的功能。数据集合部分则有两方面的内容,及程序运行时所需的数据部分和工作区。
如果一个程序能为多个线程同时共享执行,它是进程执行时不可修改的部分。而数据集合部分则通常为一个进程独占,可修改。
程序和数据集合是进程存在的物质基础,是进程的实体。
进程控制块也称为进程描述快,它包含了进程的描述信息和控制信息,是进程动态特性的集中反映。

总之,进程基本上有自己独立的代码和数据空间,独立的程序计数器等上下文环境,进程切换的开销是较大的。

===================================

线程相关

由于进程间切换消耗比较大(需要将进程的内存切换),创建时消耗大(每个进程都有独立的数据和代码空间)于是在进程内部引入线程的概念来实现并发性。
一个进程可创建多个线程,线程之间具备并发性。不同的线程之间可以共享进程的地址空间和数据。

线程是一个程序或者进程内部的一个顺序控制流。线程本身不能独立运行,必须在进程中执行,使用进程的地址空间。每个进程有
自己单独的程序计数器,称为堆栈和本地变量。

每个程序执行时都会产生一个进程,而每个进程至少要有一个主线程。多线程就是在一个进程内有多个线程。

总之,进程内的同一类线程可以共享代码和数据空间,每个线程有独立的运行栈和程序计数器,切换的开销比较小,灵活性高。
在支持超线程和多核CPU上,多线程能够并发或者并行执行,可以在同一时段完成不同的任务,或者加快程序的执行。同一个进程内的
多个线程,调度比较灵活,可以相互协调和协作共同完成特定的任务。
==============================
创建多线程

继承Thread类或实现Runnable接口(或FutureTask类 ,其实也是实现了Runnable)

FutureTask ft= new FutureTask(new Callable<V>() {

    @Override
    public V call() throws Exception {  
 return null;
    }
       
});
    
new Thread(ft);
ft.get()//返回数据,这是用FutureTask的目的

================================
线程池

创建线程会使用相当一部分内存,其中包括有堆栈,以及每线程数据结构。如果创建过
多线程,其中每个线程都将占用一些 CPU  时间,结果将使用许多内存来支持大量线程,
每个线程都运行得很慢。这样就无法很好地使用计算资源。

Java 自从5.0 以来,提供了线程池。线程的目标执行对象可以共享线程池中有限数目的
线程对象。

例子:
100 个线程目标对象共享2 个线程

....
     //  在线程池中创建2 个线程 
    ExecutorService exec = Executors.newFixedThreadPool(2); 
    //  创建100 个线程目标对象 
    for (int index = 0; index < 100; index++) { 
         Runnable run = new Runner(index); 
          //  执行线程目标对象 
          exec.execute(run); 
    } 
    // shutdown 
    exec.shutdown(); 

....
//  线程目标对象 
class Runner implements Runnable { ... }


使用JDK 提供的线程池一般分为3 步:
1)创建线程目标对象,可以是不同的,例如程序中的Runnner;
2)使用Executors 创建线程池,返回一个ExecutorService类型的对象;
3)使用线程池执行线程目标对象,exec.execute(run),
   最后,结束线程池中的线程,exec.shutdown()。
==============================================================
线程的基本控制

1 使用Sleep 暂停执行

Thread.sleep()使当前线程的执行暂停一段指定的时间,这可以有效的使应用程序的其他
线程或者运行在计算机上的其他进程可以使用处理器时间。该方法不会放弃除CPU 之外的
其它资源。 也可指定时间,Thread.sleep(1000)。

2 使用join 等待另外一个线程结束

Join 方法让一个线程等待另一个线程的完成,如果t1,t2 是两个Thread 对象,在t1 中
调用t2.join(),会导致t1 线程暂停执行,直到t2 的线程终止。也可指定时间,如t.join(2000);

3 使用中断(Interrupt)取消线程
有三种方法可以使线程终止:
1)run()方法正常返回;2)run()方法意外结束;3)应用程序终止。

线程自己检查中断状态并终止线程比直接调用stop()放要安全很多,因为线程可以保存
自己的状态。并且stop()方法已经不推荐使用了。

和中断线程有关的方法有:
1)t.interrupt(),向线程发送中断,
2)t.isInterrupted(),测试线程是否已经被中断;
3)Thread.interrupted (),测试当前线程是否已经被中断,随后清除线程“中断”状态的静态方法。

线程的中断状态只能有线程自己清除,当线程侦测到自己被中断时,经常需要在响应中
断之前做某些清除工作,这些清除工作可能涉及那些在线程仍然保持中断状态时会受到影响
的操作。
如果被中断的线程正在执行sleep,或者wait 方法,就会抛出InterruptedException 异常。
这种抛出异常的中断会清除线程的中断状态。

4 使用Stop 终止线程

该方法具有固有的不安全性(现在已经过时了)。用 Thread.stop  来终止线程将释放它已经锁定的所有监视
器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监
视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能
导致任意的行为。
分享到:
评论

相关推荐

    面试专题--并发篇代码

    以上就是并发编程的一些基础知识点,深入理解和熟练掌握这些概念,对Java面试和实际开发都将大有裨益。面试中,可能会遇到的问题包括但不限于线程安全的实现、死锁的分析与解决、线程池的参数配置等。通过实践和学习...

    面试必问并发编程高级面试专题-09.rar

    本专题针对的是高级面试中的并发编程问题,旨在帮助求职者深入理解并发概念,掌握核心技术和解决策略。 首先,我们需要理解并发编程的基础概念。并发是指在一段时间内,多个任务看似同时执行的状态。这种现象可以...

    Java面试专题-面试人员必看-微服务架构面试专题系列:Tomcat+Mysql+设计模式+并发+Netty+JVM.rar

    本面试专题涵盖了微服务架构中的关键组件,包括Tomcat、Mysql、设计模式、并发处理、Netty以及JVM。以下是这些主题的详细说明: 1. **Tomcat**:作为Java Servlet容器,Tomcat是Web应用程序的基础。了解其工作原理...

    面试真题包含spring-java-集合-框架-并发-spring-运维-数据库等多领域45卷合集.rar

    在并发领域,"并发面试专题.pdf"可能会包含线程安全、锁机制、并发工具类如Semaphore、CountDownLatch和CyclicBarrier,以及Java内存模型(JMM)等内容。求职者需要了解如何避免死锁,掌握线程池的工作原理,以及...

    面试专题-并发篇讲义.pdf

    【并发编程】是Java开发中的重要领域,面试中经常被问到。理解并掌握线程的状态转换对于理解和解决并发问题至关重要。...理解这些概念对于编写高效、安全的并发程序至关重要,也是Java面试中常考察的知识点。

    面试专题-面试人员必看-并发面试专题1.pdf

    Java并发编程是Java高级开发人员面试中的一个重要议题,其中对Synchronized关键字的理解和使用又是并发面试中的核心问题之一。Synchronized关键字是Java提供的原生同步机制,用于控制多线程对共享资源的互斥访问。...

    分布式事务专题-v1.1

    分布式事务是计算机科学中的一个重要概念,特别是在大型...理解并掌握分布式事务的概念和技术,对于构建高可用、高并发的分布式系统至关重要。通过深入学习本专题,开发者将能够有效地应对复杂分布式环境中的事务挑战。

    并发专题.zip

    在这个“并发专题.zip”压缩包中,我们可以期待找到一系列关于并发编程的知识点和资源。 并发编程的核心概念包括线程、进程、同步与互斥、死锁、活锁以及饥饿等。下面我们将详细讨论这些关键概念。 1. **线程与...

    面试必问并发编程高级面试专题.zip

    本面试专题主要针对高级并发编程的知识点进行探讨,旨在帮助求职者在面试中展现出深厚的并发编程理论基础和实践经验。 1. **线程与进程** - **线程定义**:线程是操作系统分配处理器时间的基本单位,它是进程中...

    并发基础RunnableThreadExecutor专题.pdf

    本文将深入探讨并发基础,重点关注Runnable、Thread以及Executor服务这三个核心概念。 首先,`Runnable`接口是Java并发编程的基础,它定义了一个单一的`run()`方法。实现Runnable接口意味着你创建了一个可执行的...

    JDBC专题(六)-JDBC专题-事务的隔离级别.docx

    ### JDBC专题(六)-JDBC专题-事务的隔离级别 #### 一、事务的基本概念与特性 事务在数据库管理中扮演着极其重要的角色,尤其是在处理关键业务逻辑时,确保数据的一致性和完整性至关重要。根据提供的文件信息,我们...

    并发面试专题.pdf

    ### 并发面试专题知识点详解 #### 一、Synchronized的基本概念及原理 **Synchronized** 是Java语言中用于实现线程同步的关键字之一。它主要用于控制多个线程对共享资源的访问,确保同一时刻只有一个线程能够访问...

    面试专题-ActiveMQ专题部分

    本面试专题主要针对ActiveMQ的相关知识点进行深入探讨,帮助求职者在面试中展现出对这一领域的专业理解。 1. **消息中间件的基本概念**:ActiveMQ作为消息中间件,它的核心功能是通过消息传递来实现应用程序间的...

    嵌入式培训网络编程专题-网络编程讲义及配套源代码

    本专题旨在帮助学习者掌握TCP和UDP协议的使用,以及如何设计并发服务器,从而在实际项目中构建高效、稳定的网络通信系统。 首先,我们要理解TCP(传输控制协议)和UDP(用户数据报协议)是互联网通信的两大基础。...

    java筑基(基础)面试专题系列(二):并发+Netty+JVM.zip

    深入学习以上三大专题,将使你具备扎实的Java基础,无论是在面试中还是实际工作中,都能应对各种挑战。对于并发编程,要注重理论与实践结合,多做并发编程练习;对于Netty,可以通过搭建项目实战来提升;对于JVM,...

    并发编程面试专题.pdf

    ### 并发编程面试专题知识点解析 #### 一、线程执行顺序控制 **知识点:** 1. **问题描述:** 如何确保线程T2在T1执行完毕后开始执行,T3在T2执行完毕后开始执行? 2. **解决方案:** 可以通过`Thread.join()`方法...

    并发学习并发学习并发学习并发学习并发学习

    6. **并发专题完整代码**:这些文件(如`juc-demo`, `juc-demo1107`, `juc-demo`, `jucdemo`, `jucdemo(1)`等)很可能包含了各种并发编程的示例代码,可以用来学习和理解并发编程的各种实践技巧和陷阱。 7. **...

    分布式事务专题-v1.1.docx

    分布式事务专题 分布式系统在现代IT环境中扮演着关键角色,它们将单一的应用程序分解成多个独立部署的服务。在这样的架构中,服务之间的交互通常需要通过网络进行,这就引入了分布式事务的概念。分布式事务是为了...

Global site tag (gtag.js) - Google Analytics