线程

interrupted isinterrupted interrupt

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-02 16:46:51
在java Thread中,关于中断有三个方法,经常搞混,现在简单分析: interrupted 类方法 ,常用于线程内部检测当前线程是否 中断,并且清除中断标志,也就是说 如下代码,打印的是false。 if(Thread.interrupted()){ System.out.println(Thread.interrupted()); } isinterrupted 实例方法,用于在线程外线程 间调用,检测其它线程是否处于中断。 interrupt 实例 方法,一般用于线程间调用 t.interrupt,也可以在本线程调用 ,如下。 Thread.currentThread().interrupt(); 而在使用过程中,有些方法会自动抛出 中断异常,如sleep,await 等,而对于 方法内部自己抛出的异常,需要主动的catch或者继续抛出该异常。 来源: oschina 链接: https://my.oschina.net/u/2834932/blog/760053

程序员面试都会遇到的问题:进程和线程的区别,你该如何回答?

♀尐吖头ヾ 提交于 2020-03-02 16:37:38
当你刚入职场时,无论你是用C++还是Java甚至只是应聘运维岗位,相信你都会遇到这个问题。 这是一个很基础的问题,但又是一个很考验人水平的问题。 说基础是因为每个学计算机的人都应该懂,进程线程是计算机的基础概念,是每个程序员时时刻刻都要接触的东西。 但这又是一个充满陷阱可以无限扩展和深入的一个问题。比如可以从操作系统知识扩展到计算机组成原理,可以从单线程扩展到并发编程,可以从并发编程深入到线程同步、线程安全、进程间通信等等。 那么我们该如何回答好这个问题呢? 既然要谈区别,那么首先需要理解什么是进程和线程。 之前,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。 1 .计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 2 .假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。 3 .进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。 4 .一个车间里,可以有很多工人。他们协同完成一个任务。 5 .线程就好比车间里的工人。一个进程可以包括多个线程。 6 .车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。 7

xz 多线程压缩支持详解

倖福魔咒の 提交于 2020-03-02 15:31:38
XZ多线程压缩支持详解 xz的旧版不支持多线程压缩。需要下载编译新版的xz(支持 -T参数的版本)我这里是 5.2.4 使用xz进行压缩: xz -9 -k -z release.tar 使用xz进行多线程压缩: xz -9 -T 12 -k -z release.tar 但是使用时你会发现,很多时候使用 -T 参数不能全核编译,我在一台6核12线程的机器上,压缩一个1.2G的文件。使用 -T -9 也就是采用最高压缩率的时候,CPU的最高占用率只能达到600%,使用 -T -6 的时候,才可以用到全部的12核编译。 造成这个问题的原因,和xz多线程压缩的原理有关。 多线程压缩的时候,xz会将待压缩的文件分成几个部分,每一个线程压缩一个部分。 默认情况下,分块的大小是LZMA2文件夹的三倍。使用-6,目录大小为8Mib,并且块大小24 MiB。 而对于-9,它们是64 MiB和192 MiB。 所以如果输入文件不够大,就无法使用所有CPU核心。 当然,块大小可以使用 --block size=size 选项进行调整。 减小块大小往往会降低压缩率,并且会对内存造成很大的占用。以换取压缩速率上的提升。 需要注意的是,设置分割块的大小,不能小于LZMA2文件夹的大小。所以使用 -9 时,块大小的设置也不能低于64Mib。 更改块大小影响压缩时候的RAM使用,如果设置不合理很可能内存会爆掉

关于interrupt

人盡茶涼 提交于 2020-03-02 15:28:46
Thread类中有这么几个方法: public void interrupt() public static boolean interrupted() public boolean isInterrupted() interrupt() 中断线程。 如果当前线程没有中断自己(这在任何情况下都是允许的),则该线程的checkAccess方法就会被调用,这可能抛出SecurityException。 如果线程在调用 Object 类的 wait() 、 wait(long) 或 wait(long, int) 方法,或者该类的 join() 、 join(long) 、 join(long, int) 、 sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException 。 如果该线程在 可中断的通道 上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException 。 如果该线程在一个 Selector 中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup 方法一样。 如果以前的条件都没有保存,则该线程的中断状态将被设置。

jstack分析java进程卡死的情况

纵然是瞬间 提交于 2020-03-02 15:25:54
(1)cpu使用率高 1.通过top命令查看机器状况** 可以看出cpu使用率非常高,并且java进程的cpu使用率超过了90% 2.查看是java进程中的哪个线程使用率最高 因为java进程的pid为3461,使用如下命令 top -H -p 3461 结果为: 可以看出3462这个线程的cpu使用率最高 使用printf可以将3462转化为16进制,方便在dump文件中查看 printf "%x\n" 3462 3.dump线程堆栈信息 因为java进程的pid为3461,所以执行如下命令 jstack -l 3461 > thread.log 多dump几次,打开thread.log,查找nid为3462,即0xd86的线程,结果为 发现都是停留在Hello.java第六行的地方,检查代码,发现确实是有死循环 (2)cpu使用率不高 1.通过top命令查看cpu使用率 结果为: 发现cpu使用率非常低 2.dump堆栈信息 首先查看java进程pid,可以使用jps或者ps jps 或 ps -aux | grep java 结果为: 可以看出java进程pid为3579 接着使用jstack打印堆栈信息,拉到最下面,可以看出有死锁信息 其实这在上面的日志中就可以看到: 线程1在等待250这个锁而它拥有260,而250这个锁查找后发现被线程0locked了

RunLoop相关知识点

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-02 14:25:31
NSRunLoop类声明的编程接口对象管理输入源。NSRunLoop对象处理鼠标和键盘等输入来源来自窗口系统的事件,NSPort对象,NSConnection对象。还一个NSRunLoop对象流程NSTimer事件 - (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode; + (NSRunLoop *)currentRunLoop; + (NSRunLoop *)mainRunLoop NS_AVAILABLE(10_5, 2_0); 消息处理模式,对消息处理过程进行了更好的抽象和封装 1.输入事件来源:输入源(input source)和定时源(timer source).使用程序的某一特定的处理例程来处理到达的事件。 当你创建输入源,你需要将其分配给runloop中的一个或多个模式。模式只会在特定事件影响监听的源。大多数情况下,runloop运行在默认模式下,但是你也可以使其运行在自定义模式下。若某一源在当前模式下不被监听,那么任何其生成的消息只在runloop运行在其关联的模式下才会被传递。 传递异步事件,通常消息来自于其他线程或程序。输入源传递异步消息给相应的处理例程,并调用runUntilDate:方法来退出(在线程里面相关的NSRunLoop对象调用) 1.1 基于端口的输入源由内核自动发送

2020-3-2 牛客试题复盘

…衆ロ難τιáo~ 提交于 2020-03-02 13:21:54
1、有关线程的叙述正确的是(B) A、可以获得对任何对象的互斥锁定。 B、通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定。 C、线程通过使用synchronized关键字可获得对象的互斥锁定。 D、线程的创建只能通过继承Thread类来实现。 解析: 互斥锁指的是只有一个线程可以访问该对象。 通过继承Thread类或实现Runnable接口,只是创建线程的两种方式。 2、以下程序的运行结果是:( C ) TreeSet<Integer> set = new TreeSet<Integer>(); TreeSet<Integer> subSet = new TreeSet<Integer>(); for(int i= 606 ;i< 613 ;i++){ if(i% 2 == 0 ){ set.add(i); } } subSet = (TreeSet)set.subSet( 608 ,true, 611 ,true); set.add( 629 ); System.out.println(set+ " " +subSet); A、编译失败 B、发生运行时异常 C、[606, 608, 610, 612, 629] [608, 610] D、[606, 608, 610, 612, 629] [608, 610,629] 解析: 去翻了API=====

JUC锁框架——CyclicBarrier

荒凉一梦 提交于 2020-03-02 12:47:40
CyclicBarrier的简单介绍 CyclicBarrier是一个同步辅助类,它允许一组线程相互等待,直到到达某个公共屏障点(common barrier point)。通过它可以完成多个线程之间相互等待,只有当每个线程都准备就绪后,才能各自继续往下执行后面的操作。 CyclicBarrier通过计数器来实现的。当某个线程调用await方法时,该线程进入等待状态,计数器加1,当计数器的值达到设置的初始值时,所有因调用await进入等待状态的线程被唤醒,继续执行后续操作。 因为CycliBarrier在释放等待线程后可以重用,所以称为循环barrier。CycliBarrier支持一个可选的Runnable,在计数器的值到达设定值后(但在释放所有线程之前),该Runnable运行一次 ,注,Runnable在每个屏障点只运行一个。 CyclicBarrier与CountDownLatch比较 CyclicBarrier与CountDownLatch本质上都是依赖于volatile和CAS实现,两者比较如下: |CyclicBarrier|CountDownLatch| |:|:| |一个线程(或者多个),等待另外N个线程完成某个事情之后才能执执行|N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。| |一次性的|可以重复使用| |基于AQS|基于锁和Condition

Xcode 调试技巧

我怕爱的太早我们不能终老 提交于 2020-03-02 12:39:33
   【前言】:本篇为同事崔桂祥分享资料。   随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。LLDB为Xcode提供了底层调试环境,其中包括内嵌在Xcode IDE中的位于调试区域的控制面板,在这里我们可以直接调用LLDB命令,示例如下: 1.必备篇 1.1 打印变量: print/po print :打印变量的值可以使用 print命令,该命令如果打印的是简单类型,则会列出简单类型的类型和值。如果是对象,还会打印出对象指针地址; print object :如果我们只想查看对象的值的信息,则可以使用 po (print object的缩写 )命令。 1.2 查看线程状态: thread list   在进程停止后,LLDB会选择一个当前线程和线程中当前帧(frame)。很多检测状态的命令可以用于这个线程或帧。   为了检测进程的当前状态,使用该命令,其中星号(*)表示thread #1为当前线程。 1.3 获取线程的跟踪栈: thread backtrace (简写bt)   使用命令 thread backtrace (简写bt)可以查看线程的跟踪栈,若要查看所有线程的调用栈则可以使用命令: thread backtrace all (简写bt all) 。

Xcode 调试技巧

强颜欢笑 提交于 2020-03-02 12:38:17
随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。LLDB为Xcode提供了底层调试环境,其中包括内嵌在Xcode IDE中的位于调试区域的控制面板,在这里我们可以直接调用LLDB命令 目录 一、 必备篇 • 打印变量 • 查看线程状态 • 获取线程的跟踪栈 • 列出帧参数和本地变量 • 寻址 • 帮助系统 二、 技巧篇 • 运行时修改变量的值 • 异常排查 • 符号断点 • Watchpoints 一、必备篇 1.1 打印变量 print :打印变量的值可以使用 print命令,该命令如果打印的是简单类型,则会列出简单类型的类型和值。如果是对象,还会打印出对象指针地址 print object :如果我们只想查看对象的值的信息,则可以使用 po(print object的缩写 )命令 1.2 查看线程状态 thread list 在进程停止后, LLDB会选择一个当前线程和线程中当前帧 (frame)。很多检测状态的命令可以用于这个线程或帧。 为了检测进程的当前状态,使用该命令,星号 (*)表示 thread #1为当前线程 1.3 获取线程的跟踪栈 使用命令 thread backtrace (简写bt),若要查看所有线程的调用栈则可以使用命令: thread