上一页 1 ··· 43 44 45 46 47 48 49 50 51 ··· 69 下一页
  2013年7月26日
摘要: 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的。就像学习每一门编程语言一样,Hello World!都是最经典的例子。 实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了。对于此模型,应该明确一下几点:1、生产者仅仅在仓储未满时候生产,仓满则停止生产。2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。3、当消费者发现仓储没产品可消费时候会通知生产者生产。4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。package cn.thread;import java.util.concurrent.BlockingQu 阅读全文
posted @ 2013-07-26 14:33 Ruthless 阅读(69556) 评论(12) 推荐(3)
  2013年7月25日
摘要: 对于阻塞栈,与阻塞队列相似。不同点在于栈是“后入先出”的结构,每次操作的是栈顶,而队列是“先进先出”的结构,每次操作的是队列头。 这里要特别说明一点的是,阻塞栈是Java6的新特征。、 Java为阻塞栈定义了接口:java.util.concurrent.BlockingDeque,其实现类也比较多,具体可以查看JavaAPI文档。 下面看一个简单例子:package cn.thread;import java.util.concurrent.BlockingDeque;import java.util.concurrent.LinkedBlockingDeque;/** * 阻塞栈 * *. 阅读全文
posted @ 2013-07-25 17:08 Ruthless 阅读(9545) 评论(3) 推荐(1)
摘要: 阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。 有了这样的功能,就为多线程的排队等候的模型实现开辟了便捷通道,非常有用。 java.util.concurrent.BlockingQueue继承了java.util.Queue接口,可以参看API文档。package cn.thread;import java.util.concur 阅读全文
posted @ 2013-07-25 17:03 Ruthless 阅读(3831) 评论(0) 推荐(0)
摘要: 简介信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。概念Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。在这个停车场系统中,车位是公共资源,每辆 阅读全文
posted @ 2013-07-25 16:53 Ruthless 阅读(15119) 评论(0) 推荐(3)
摘要: 在上文中提到了Lock接口以及对象,使用它,很优雅的控制了竞争资源的安全访问,但是这种锁不区分读写,称这种锁为普通锁。为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,在一定程度上提高了程序的执行效率。 Java中读写锁有个接口java.util.concurrent.locks.ReadWriteLock,也有具体的实现ReentrantReadWriteLock,详细的API可以查看JavaAPI文档。 下面这个例子是在文例子的基础上,将普通锁改为读写锁,并添加账户余额查询的功能,代码如下:package cn.thread;import java.ut 阅读全文
posted @ 2013-07-25 11:35 Ruthless 阅读(2006) 评论(1) 推荐(1)
摘要: 在Java5中,专门提供了锁对象,利用锁可以方便的实现资源的封锁,用来控制对竞争资源并发访问的控制,这些内容主要集中在java.util.concurrent.locks 包下面,里面有三个重要的接口Condition、Lock、ReadWriteLock。Condition: Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。Lock: Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定 阅读全文
posted @ 2013-07-25 11:22 Ruthless 阅读(3407) 评论(0) 推荐(1)
摘要: 在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写。或者干脆绕过这道坎,走别的路了。 现在Java终于有可返回值的任务(也可以叫做线程)了。 可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。 执行Callable任务后,... 阅读全文
posted @ 2013-07-25 10:29 Ruthless 阅读(7041) 评论(0) 推荐(0)
摘要: Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利。为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要。 有关Java5线程新特征的内容全部在java.util.conc... 阅读全文
posted @ 2013-07-25 09:48 Ruthless 阅读(4695) 评论(0) 推荐(0)
  2013年7月24日
摘要: Java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。public volatile boolean exit = false;在定义exit时,使用了一个Java关键字volatile,这个关键字的目的是使exit同步,也就是说在同一时刻只能由一个线程来修改exit的值.volatile关键字用于声明简单类型变量,如int、float、boolean等数据类型。如果这些简单数据类型声明为volatile,对它们的操作就会变成原 阅读全文
posted @ 2013-07-24 21:28 Ruthless 阅读(2625) 评论(3) 推荐(1)
摘要: 对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。 追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。 在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题。package cn.thread;/** * 线程同步方法 * * @author 林计钦 * @version 1.0 2013-7-24 上午10:12:47 */public class ThreadSynchronizedCode . 阅读全文
posted @ 2013-07-24 10:37 Ruthless 阅读(4586) 评论(0) 推荐(0)
摘要: 线程的同步是保证多线程安全访问竞争资源的一种手段。线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题? 在本文之前,请参阅《Java多线程-线程的同步与锁》,本文是在此基础上所写的。 对于同步,在具体的Java代码中需要完成一下两个操作:把竞争访问的资源标识为private;同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。当然这不是唯一控制并发安全的途径。 synchronized关键字使用说明synchronized只能 阅读全文
posted @ 2013-07-24 10:27 Ruthless 阅读(2277) 评论(0) 推荐(0)
摘要: 守护线程与普通线程写法上基本没啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。setDaemon方法的详细说明:public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java虚拟机退出。 该方法必须在启动线程前调用。 该方法首先调用该线程的checkA... 阅读全文
posted @ 2013-07-24 10:05 Ruthless 阅读(7149) 评论(0) 推荐(0)
摘要: 线程的合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。join为非静态方法,定义如下:void join(): 等待该线程终止。 void join(long millis): 等待该线程终止的时间最长为 millis 毫秒。 void join(long millis, int nanos): 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。package cn.thread;/** * 线程的调度(合并) * * @author 林计钦 * @version 1.0 2... 阅读全文
posted @ 2013-07-24 09:53 Ruthless 阅读(5945) 评论(1) 推荐(0)
摘要: 线程的让步含义就是使当前运行着线程让出CPU资源,但是扔给谁不知道,仅仅是让出,线程状态回到可运行状态。 线程的让步使用Thread.yield()方法,yield()为静态方法,功能是暂停当前正在执行的线程对象,并执行其他线程。package cn.thread;/** * 线程的调度(让步) * * @author 林计钦 * @version 1.0 2013-7-24 上午09:42:41 */public class ThreadYield { public static void main(String[] args) { ThreadYield thread... 阅读全文
posted @ 2013-07-24 09:46 Ruthless 阅读(2164) 评论(1) 推荐(0)
摘要: 与线程休眠类似,线程的优先级仍然无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行。 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先级为5。 在一个线程中开启另外一个新线程,则新开线程称为该线程的子线程,子线程初始优先级与父线程相同。package cn.thread;/** * 线程的调度(优先级) * * @author 林计钦 * @version 1.0 2013-7-24 上午09:30:42 */public class ThreadPriority { public static void mai... 阅读全文
posted @ 2013-07-24 09:38 Ruthless 阅读(3357) 评论(0) 推荐(0)
摘要: Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。 这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。 线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行。线程休眠的方法是Thread.sleep(long millis)和Thread.sleep(long millis, int nanos),均为静态方法,那调用sleep休眠的哪个线程呢?简单说,哪个线程调用sleep,就休眠哪个线程。 阅读全文
posted @ 2013-07-24 09:20 Ruthless 阅读(7914) 评论(0) 推荐(0)
  2013年7月23日
摘要: 一、线程交互的基础知识void notify():唤醒在此对象监视器上等待的单个线程。 void notifyAll():唤醒在此对象监视器上等待的所有线程。 void wait():导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()方法。 当然,wait()还有另外两个重载方法:void wait(long timeout):导致当前的线程等待,直到其他线程调用此对象的 notify()方法或 notifyAll()方法,或者超过指定的时间量。 void wait(long timeout, int nanos):导致当前的线程等待,直到其他线程调用 阅读全文
posted @ 2013-07-23 16:56 Ruthless 阅读(11325) 评论(0) 推荐(3)
摘要: 一、同步问题提出线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据。package cn.thread;public class Foo { private int x = 100; public int getX() { return x; } public int fix(int y) { x = x - y; return x; }}package cn.thread;public class MyRunn... 阅读全文
posted @ 2013-07-23 16:38 Ruthless 阅读(50553) 评论(6) 推荐(17)
摘要: 线程可以分为4个状态:New(新生),Runnable(可运行):为了方便分析,还可将其分为:Runnable与Running。blocked(被阻塞),Dead(死亡)。与人有生老病死一样,线程也同样要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。下面给出了Thread类中和这四种状态相关的方法。// 开始线程 public void start( ); public void run( ); // 挂起和唤醒线程 public void resume( ); // 不建议使用 public void suspend... 阅读全文
posted @ 2013-07-23 14:49 Ruthless 阅读(23320) 评论(0) 推荐(1)
摘要: 一、操作系统中线程和进程的概念现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 “同时”执行是线程给人的感觉,在线程之间实际上是轮换执行。 二、Java中的线程创建多线程的两种方式:继承Thread类和实现Runnable接口。 一个Thread类实例只是一个对象,像J. 阅读全文
posted @ 2013-07-23 11:37 Ruthless 阅读(4741) 评论(0) 推荐(1)
上一页 1 ··· 43 44 45 46 47 48 49 50 51 ··· 69 下一页