线程阻塞

线程状态

☆樱花仙子☆ 提交于 2020-04-04 03:44:50
/** * 线程的状态分析 * @author aa * */ public class ThreadState { public static void main(String[] args) throws Exception { /** * 新建线程,线程为新建状态 * jdk:至今尚未启动的线程的状态。 * 如果不给线程设置名称,线程的名称将会是:Thread-0,Thread-1。。。。。 */ ThreadDemo td = new ThreadDemo() ; System.out.println("新建状态:" + td.getState()) ; // 新建状态:NEW /** * 可运行状态:当线程有资格运行,调用start方法,线程首先进入可运行状态, * 可运行状态,不一定被线程调度程序运行, * 简单来说,调用start方法后,该线程依然是可运行状态,但未运行, * 存放在可运行池中, * 线程在运行的过程中,该线程的状态也是可运行状态 * * djk:可运行线程的线程状态。处于可运行状态的某一线程正在 Java 虚拟机中运行, * 但它可能正在等待操作系统中的其他资源,比如处理器。 */ td.start() ; System.out.println("可运行状态:" + td.getState()) ; // 可运行状态:RUNNABLE /** *

Grand Central Dispatch (GCD) 转

北城余情 提交于 2020-04-03 05:31:34
GCD是异步执行任务的技术之一。 GCD使用很简洁的记述方法,实现了极为复杂繁琐的多线程编程。 dispatch_async(queue, ^{ //长时间处理 //例如AR用动画识别 //例如数据库访问 //长时间处理结束,主线程使用该处理结果 dispatch_async( dispatch_get_main_queue(), ^{ //只在主线程可以执行的处理 //例如用户界面更新 }); }); 在NSObject中,提供了两个实例方法来实现简单的多线程技术:performSelectorInBackground:withObject performSelectorOnMainThread。 我们也可以改用performSelector系方法来实现前面使用的GCD。 //NSObject performSelectorInBackground:withObject:方法中执行后台线程 - (void)launchThreadByNSObject_performSelectorInBackground_withObject { [self performSelectorInBackground:@selector(doWork) withObject:nil]; } //后台线程处理方法 - (void)doWork { @autoreleasepool{ //长时间处理,

Grand Central Dispatch(GCD)详解

蓝咒 提交于 2020-04-03 05:31:01
概述 GCD 是苹果异步执行任务技术,将应用程序中的线程管理的代码在系统级中实现。开发者只需要定义想要执行的任务并追加到适当的 Dispatch Queue 中, GCD 就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可以统一管理,也可执行任务,这样比以前的线程更有效率。 GCD的使用 dispatch_sync与dispatch_async dispatch_sync synchronous 同步,一旦调用 dispatch_sync 方法,那么指定的处理 (block) 追加到指定 Dispatch Queue 中在执行结束之前该函数都不会返回,也就是说当前的线程会阻塞,等待 dispatch_sync 在指定线程执行完成后才会继续向下执行。 dispatch_async synchronous异步,一旦调用 dispatch_async 方法,那么指定的处理 (block) 追加到指定的 Dispatch Queue 中, dispatch_async 不会做任何等待立刻返回,当前线程不受影响继续向下执行。 注意 使用 dispatch_sync 容易造成死锁,一般情况下应该使用 dispatch_async ,例如 dispatch_queue_t queue = dispatch_get_main_queue(); dispatch

Java常见面试题——仅供实习

回眸只為那壹抹淺笑 提交于 2020-04-03 05:25:12
注:从网络整理而来。红字为不理解,待查阅内容 1.面向对象的特征有哪些方面? 抽象,就是将具有一致属性和行为的对象抽象成一个类,只强调本质的属性和行为,先不考虑具体的细节。 继承,子类自动共享父类的属性和行为。单重继承是指子类只继承一个父类的属性和行为,多重继承是子类可以继承多个类的属性和行为。 多态,相同的函数作用在不同的对象上会获得不同的结果。 封装,只给用户看用户需要看的东西。 2.int 和 Integer 有什么区别 Java 提供两种不同的类型:原始类型(或内置类型)和引用类型。Java为每个原始类型提供了封装类。 Int是java的原始数据类型,Integer是java为int提供的封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double 引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题等。另外,对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。 3.String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串。 String类提供了数值不可改变的字符串

第十三周学习笔记

自作多情 提交于 2020-04-02 21:47:54
第十二章 并发编程 进程是程序级并发,线程是函数级并发。 三种基本的构造并发程序的方法: 进程: 每个逻辑控制流是个一个进程,由内核进行调度和维护。 I/O 多路复用: 应用程序在一个进程的上下文中显式地调度他们自己的逻辑流。 线程: 运行在单一进程上下文中的逻辑流,由内核进行调度。 12.1 基于进程的并发编程 构造并发程序最简单的方法就是 用进程。 使用大家都很熟悉的函数例如: fork exec waitpid 关于在父、子进程间共享状态信息:共享文件表,但不共享用户地址空间。 进程又独立的地址空间既是优点又是缺点: 优点:防止虚拟存储器被错误覆盖 缺点:开销高,共享状态信息才需要IPC机制 12.2 基于I/O多路复用的并发编程 就是使用select函数要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。 select函数处理类型为fd_set的集合,也叫做 描述符集合。 select函数有两个输入:一个称为 读集合 的描述符集合和该妒忌和该读集合的基数(n)(实际上是任何描述符集合的最大基数)。select函数会一直阻塞,直到读集合中至少有一个描述符准备好可以读。当且仅当一个从该描述符读取一个字节的请求不会阻塞时,描述符K就表示准备好可以读了。 作为一个副作用,select修改了参数fdset指向的fd_set,指明读集合中一个称为准备好集合的子集

多线程学习笔记

…衆ロ難τιáo~ 提交于 2020-04-02 21:42:51
一、多线程简介    我们所说的 Windows是一个多任务操作系统,是说Windows能同时执行多个程序。当我们每运行一个程序的时候其实就开启了一个进程,进程中包含了这个程序运行所需要的文本代码、变量和动态分配的内存、堆栈等资源,进程之间先对独立,一个进程不会干扰另一个进程的运行。在.net中进程可以包含多个应用程序域和线程,应用程序域是一个逻辑区域(不做详细介绍)。线程是进程中的基本执行单元,线程可以帮一个进程同时做多件事,线程主要由线程ID,当前指令指针(PC),寄存器集合和堆栈组成,同一进程的多个线程可以在宏观上并发的执行,但在微观上CPU同时只能执行一个线程,所以线程也就有了就绪,阻塞,运行三种状态,具体CPU执行那个线程这由 系统 根据线程的优先级决定。程序入口的线程叫主线程,在.net中就是Main()方法作为入口的,调用Main()方法系统就会创建一个主线程。   所谓多线程就是在一个进程内运行多个线程来协同完成工作,这样能在一定程度上提高程序的性能,最明显的就是在做winform开发的时候,如果不用多线程,当我们处理数据的时候程序界面是卡死的,这就是因为在只有一个线程的时候,处理数据的和UI是在一个线程(主线程)中,但处理数据的时候这个线程是不会去处理前台UI的,所以我们会感觉程序卡死了。多线程的缺点就是CPU要花时间来处理要执行那个线程..... 二、

Java IO7:管道流、对象流

為{幸葍}努か 提交于 2020-04-02 20:27:00
一、前言   前面的文章主要讲了文件字节输入流FileInputStream、文件字节输出流FileOutputStream以及对应的字节缓冲流,文件字符输入流FileReader、文件字符输出流FileWriter以及对应的字符缓冲流,这些都是常见的流类。当然,除了这些流类,Java还提供了别的流类供用户使用,接下来看一下管道流和对象流。 二、管道流   管道流主要用于连接两个线程的通信,充当一个信息传递的管道。管道流也分为字节流(PipedInputStream、PipedOutputStream)和字符流(PipedReader、PipedWriter)。比如一个管道输出流PipedOutputStream必须和一个管道输入流PipedInputStream进行连接而产生一个通信管道,管道输出流PipedOutputStream向管道中写入数据,管道输入流PipedInputStream从管道中读取数据。管道流的工作如下图所示:         举例说明管道流的用法。既然管道流的作用适用于线程之间的通信,那么势必会有发送信息的线程和接收信息的线程,先定义一个发送数据的线程,通过管道输出流的write()方法将数据写入到管道中。 public class SendDataThread implements Runnable{ private PipedOutputStream

谈谈Java的线程池设计

懵懂的女人 提交于 2020-04-02 20:16:53
在实际项目中,如果因为想异步执行暂时性的任务而不断创建线程是很浪费资源的事情(当一个任务执行完后,线程也没用了)。这种情况下,最好是将任务提交给线程池执行。 所谓池,就是将管理某一种资源,对资源进行复用的对象。线程池就是对线程管理的对象。 本文就是介绍线程池内部是如何管理线程,并复用线程的。 相关接口 JDK在内部对线程池提供了大致四层的接口(类)用来提供线程池的行为,分别是顶层接口 Executor (这个接口可以理解为执行器,负责执行任务,),可关闭的执行器 ExecutorService (这个接口开始才具备线程池的概念),提供线程池基本框架的抽象类 AbstractExecutorService ,以及线程池的具体实现 ThreadPoolExecutor 。 Executor /** * 线程池顶层接口 * 可以执行提交的命令 */ public interface Executor { /** * 执行提交的命令 * @param command */ void execute(Runnable command); } Executor 只定义了线程池一个行为 execute() 方法,负责执行提交的任务。 ExecutorService package java.util.concurrent; import java.util.List; import java

C# 多任务之 Task

我的未来我决定 提交于 2020-04-02 15:34:05
Task 是什么 ? Task 是一个类, 它表示一个操作不返回一个值,通常以异步方式执行。 Task 对象是一个的中心思想 基于任务的异步模式 首次引入.NET Framework 4 中。 继承层次结构 System.Object    System.Threading.Tasks.Task      System.Threading.Tasks.Task<TResult> 因为由执行工作 Task 对象通常以异步方式执行在线程池线程上而不是以同步方式在主应用程序线程,您可以使用 Status 属性,以及 IsCanceled , , IsCompleted , ,和 IsFaulted 属性,以确定任务的状态。 大多数情况下,lambda 表达式用于指定的任务是执行的工作。 Task 怎么用 ? 创建和执行任务 Task 可以多种方式创建实例。 最常用的方法,它位于开头 .NET Framework 4.5, ,是调用静态 Run 方法。 Run 方法提供了简单的方法来启动任务使用默认值,并且无需额外的参数。 下面的示例使用 Run(Action) 方法来启动循环,然后显示循环迭代数的任务︰ using System; using System.Threading.Tasks; public class Example { public static void Main()

转:Netty服务器线程模型概览

你离开我真会死。 提交于 2020-04-02 14:51:01
一切从ServerBootstrap开始 ServerBootstrap 负责初始话netty服务器,并且开始监听端口的socket请求。 Java代码 bootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), //boss线程池 Executors.newCachedThreadPool() //worker线程池 ) ); bootstrap.setPipelineFactory( new HttpChannelPipelineFactory()); bootstrap.setOption( "child.tcpNoDelay" , true ); bootstrap.setOption( "child.keepAlive" , true ); bootstrap.bind( new InetSocketAddress(httpPort)); //端口开始监听 ServerBootstrap 用一个ServerSocketChannelFactory 来实例化。ServerSocketChannelFactory 有两种选择,一种是NioServerSocketChannelFactory