多线程线程和并发
cuiran
爱专研新技术,喜欢挑战。
展开
-
Java怎样中断一个运行中的线程(1)
编程人员在编程过程中,多线程呈现出了一组新的难题,而如何中断一个正在运行的线程则是难题之一。本文中,作者将讲述相关的方法。<br /><br />程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的、难以发现的错误。<br />在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程。<br />背景中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续转载 2011-01-04 15:20:00 · 1747 阅读 · 0 评论 -
第一部分 线程安全(1)——变量安全
线程安全线程安全包含两个方面变量安全:进程中有多个线程在同时运行,而这些线程可能会同时运行某一段代码如果每次运行结果和单线程运行的结果是一样的。而且其他变量的值也和预期的是一样的,称为变量安全。反正,就不能叫变量安全。线程同步:代码中的业务逻辑是一个原子性的动作,一旦分割执行就可能导致丧失其本来意义。然而在多线程环境下,运行中的线程被线程调度器暂时“叫停”的可能性随时存在的,这就给原子性的业务动作造成了潜在的危险。这时必须启用线程同步机制,即在一个线程执行完这组动作之前,其他线程不能进入这段代码。首先介绍变原创 2011-01-18 17:41:00 · 3937 阅读 · 0 评论 -
第四部分 服务器的工作模式
<br />现在网络服务器一般工作在多线程模式下,主线程负责侦听和接入来自客户端的链接请求,在收到一个连接请求之后转交给另一个线程进行处理,自身继续返回侦听状态。<br />在如何处理客户端请求方面,有两种选择:1。每当收到请求之后实时地创建一个新线程;2。在服务器启动时便预先创建一批线程,这些线程在空闲时处于等待状态,当接入到一个新请求后,服务器从这些线程中唤醒一个,使其成为工作线程,处理接入的请求。<br /><br />就第一种来说,创建线程需要消耗一定的资源,具有潜在的不稳定因素。在需要时才创建线程原创 2011-01-19 14:46:00 · 2794 阅读 · 0 评论 -
第六部分 线程同步辅助类
线程同步辅助类<br />CyclicBarrier<br /><br />java.uril.concurrent.CyclicBarrier是一个同步辅助类,不过这里所指的同步不是本章前面一直强调的“线程同步”,而是指隶属于同一个线程组中的线程必须在指定的“集合点”上到齐。这种同步就类似于士兵野外拉练,教官要求必须在几个地点集合,再继续分头行动,然后再在某个地点集合....这几个地点就称为“集合点”<br />CyclicBarrier 类的构造方法要求传入要求同步的线程数量。CyclicBarrier原创 2011-01-20 09:53:00 · 2293 阅读 · 0 评论 -
并发情况下的多线程学习目录
<br />对近期的文章进行归纳整理,欢迎大家去阅读并发表自己的观点。<br /> <br /> <br />第一部分 线程安全(1)——变量安全<br /><br /><br /><br />第二部分 线程安全(2)——ThreadLocal变量<br /><br /><br /><br /><br />第三部分 线程安全(3)——线程同步<br /><br /><br /><br /><br />第四部分 服务器的工作模式<br /><br /><br /><br /><br />第五部分 并发工具包<原创 2011-01-20 15:34:00 · 3304 阅读 · 0 评论 -
第二部分 线程安全(2)——ThreadLocal变量
<br />在前面已经讲到了,变量安全问题。<br />1.尽量不让线程运行在同一个对象实例上,这是效率比较低的方式,而且在有的场合下,线程之间共享对象是不可避免的。<br />2.把可能被共享的变量封装在方法内部,使其成为方法的内部变量,这样即使多线程并发执行到此方法,各个线程都拥有属于自己的私有变量值。 <br /> 相对来说第二种方法还是比较推荐的。<br /><br />下面就介绍ThreadLocal变量 :一个ThreadLocal变量只能存放一个专有对象,如果线程需要多个专有对象的话。则需要设原创 2011-01-19 09:09:00 · 3071 阅读 · 0 评论 -
第五部分 并发工具包
并发工具包 Java.uril.concurrent包是一套并发工具包,包含了一些有助于简化异步执行程序代码和多线程编程的工具类。下面例程拥有一个共同的特点,都是由java.uril.concurrent.Executors 来创建各种异步任务的线程池。l java.util.concurrent.ScheduledExecutorService new ScheduledThreadPool(int corePoolSize);创建容量为corePoolSize的任务计划线程池。l java.util.c原创 2011-01-19 15:40:00 · 1998 阅读 · 0 评论 -
第七部分 阻塞队列
阻塞队列<br /><br />在应用开发领域,生产者——消费者模式代表了一种异步的通信模式,基于这种模式发展出来的消息传递机制更上一种应用架构模式。基于消息传递机制的应用系统,既可能是传统的Clinet/Servier架构,也可能打破这种格局,而形成P2P架构。<br /> 队列(Queue)因为其"先进先出(FIFO)"的特点,成为经常应用于生产者-消费者模式的数据结构。在Java中java.uril.Queue接口定义的便是队列这一数据结构,而并发工具包中的java.util.concurrent.B原创 2011-01-20 10:35:00 · 2154 阅读 · 0 评论 -
线程BlockingQueue的使用
BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个 remainingCapacity,超出此容量,便无法无阻塞地 put 附加元素。没有任何内部容量约束的 BlockingQueue 总是报告 Integer.MAX_VALUE 的剩余容量。BlockingQueue 实现主要用于生产者-使用者队列,但它另外还支持 Collection 接口。因此,举例来说,原创 2012-06-14 08:48:24 · 6925 阅读 · 0 评论 -
第八部分 多线程下载实战
实战多线程下载<br />现在很多下载软件像迅雷,旋风等都使用了多线程下载技术。比起单线程下载多线程下载在同一时间段内发出多个下载请求,每个下载请求负责下载一段内容,充分利用了网络宽带。<br /><br />因此本文就简单的通过实例来介绍怎么用多线程去下载文件。相信您看了这篇文章后也可以写个属于自己的下载软件。<br /><br />首先我们需要考虑几个难题<br />1.如何获取远程文件的尺寸,这关系到开启多个下载线程。本代码采用比较简单的线程数决策策略。固定每个线程分担的字节数任务,根据远程文件尺寸来原创 2011-01-18 15:44:00 · 2650 阅读 · 1 评论 -
第三部分 线程安全(3)——线程同步
当已经有线程在执行这段代码块时,其他的线程必须等待其执行完毕才能进入这段代码块——这就是所谓的线程同步。一.单实例线程的同步锁首先看个实例,由于缺少线程同步机制,导致线程执行结果的错误。实例代码【TestSynchronizationUsingRunnable】/** * TestSynchronizationUsingRunnable.java * 版权所有(C) 2011 cuiran2001@163.com * 创建:崔冉 2011-1-13 下午04:28:31 */pac原创 2011-01-19 10:32:00 · 3215 阅读 · 0 评论 -
第六部分 线程组
线程组线程组是java线程编程所持有的概念。在Java中,线程组是指java.lang.ThreadGroup类的对象,每个线程都隶属于唯一的一个线程组,这个线程组在线程创建时指定并在线程的整个生命周期内都不能更改。可以通过调用包含ThreadGroup类型参数的Thread类构造方法来指定线程所属线程组。若没有指定,则线程默认的隶属于名为main的系统线程组。除了预建的系统线程外,所以线程组都必须显式创建。 在java中除系统线程外的每个线程组又隶属于另一个线程组,可以在创建线程组时指定其所隶属的线程组原创 2011-01-17 12:25:00 · 4818 阅读 · 0 评论 -
Java怎样中断一个运行中的线程(2)
使用Thread.interrupt()中断线程正如Listing A中所描述的,Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和 Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。因此,如果线程被上述几种方法阻塞,正确的停止线程方式是设置转载 2011-01-04 15:22:00 · 1442 阅读 · 0 评论 -
ThreadLocal
<br />ThreadLocal<br /> <br />ThreadLocal<T><br />initialValue() : T<br />get() : T<br />set(T value)<br />remove()<br /><br />顾名思义它是local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。<br />原创 2011-01-04 15:56:00 · 1363 阅读 · 0 评论 -
Java怎样中断一个运行中的线程(3)
断I/O操作然而,如果线程在I/O操作进行时被阻塞,又会如何?I/O操作可以阻塞线程一段相当长的时间,特别是牵扯到网络应用时。例如,服务器可能需要等待一个请求(request),又或者,一个网络应用程序可能要等待远端主机的响应。如果你正使用通道(channels)(这是在Java 1.4中引入的新的I/O API),那么被阻塞的线程将收到一个 ClosedByInterruptException异常。如果情况是这样,其代码的逻辑和第三个例子中的是一样的,只是异常不同而已。但是,你可能正使用Java1.0之前转载 2011-01-04 15:25:00 · 1704 阅读 · 0 评论 -
并发集合
<br />在 Java 编程的早期阶段,位于 Oswego 市的纽约州立大学(SUNY) 的一位教授决定创建一个简单的库,以帮助开发人员构建可以更好地处理多线程情况的应用程序。这并不是说用现有的库就不能实现,但是就像有了标准网络库一样,用经过调试的、可信任的库更容易自己处理多线程。在 Addision-Wesley 的一本相关书籍的帮助下,这个库变得越来越流行了。最终,作者 Doug Lea 决定设法让它成为 Java 平台的标准部分 —— JSR-166。这个库最后变成了 Tiger 版本的 java.转载 2011-01-05 11:19:00 · 1159 阅读 · 0 评论 -
第一部分 浅谈线程的状态
首先可以看一些关于线程的状态图有六种状态。就这个图,我们简单的说一下管理线程的常用方法。l Thread类的构造方法:调用Thread类的构造方法之后,线程仅处于创状 态,并没有获得任何资源。l原创 2011-01-13 10:14:00 · 2487 阅读 · 0 评论 -
第四部分 线程的终止
对于终止运行中的线程,Thread类原本提供了一个人方法:stop();但方法已经被禁用。就目前而言,我们可以利用线程的休眠和中断机制,在子线程中有意地为调度线程安排中断机会。下面例子就是利用线程的休眠和中断机制来终止线程。【StopThread】/** * StopThread.java * 版权所有(C) 2011 cuiran2001@163.com * 创建:崔冉 2011-1-11 下午03:36:26 */package com.cayden.thread7233;原创 2011-01-14 17:21:00 · 2160 阅读 · 0 评论 -
第五部分 给程序添加退出事件
<br />java.lang.Runtime类提供了一个addShutdownHook()方法。添加虚拟机关闭钩子。有以下用途:<br />① 应用程序正常退出。在退出时只需特定的业务逻辑。<br />② 虚拟机非正常退出,如用户按下“Ctrl+C”组合键,操作系统关闭。在退出时候执行必要的挽救措施。我们可以将退出事件放在一个自定义线程的线程体中即可。<br />下面就是代码演示【TestOnExit】<br /><br />/** * TestOnExit.java * 版权所有(C) 2011原创 2011-01-14 17:41:00 · 2268 阅读 · 0 评论 -
第二部分 线程的等待和唤醒
<br /><br /><br /><br /><br />从这个图中可以看出,等待状态是一种特殊的状态。使线程陷入等待实际上是暂时剥夺线程当前拥有的CPU时间片和获取CPU时间片的资格,使其返回到就绪状态。除非被唤醒,否则等待时间已满,该线程将一直等待。不会被JVM线程调度器选中并赋予CPU时间片。处于等待的线程一旦恢复执行,与其他处于就绪状态被线程调度器选中的线程不同,将从上次结束执行的断点处开始执行,而非从头开始。<br /> 使线程中断运行,返回就绪状态的手段是调用java.lang.Object对原创 2011-01-13 14:24:00 · 13549 阅读 · 0 评论 -
java测试并发类
/** * ConTest.java * 版权所有(C) 2012 * 创建:cuiran 2012-07-12 10:12:14 */package com.wpndemo.test;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.i原创 2012-07-12 15:43:46 · 9410 阅读 · 0 评论