- 浏览: 370339 次
- 性别:
- 来自: Alien
文章分类
最新评论
-
风一样的男人__:
[flash=200,200][url]引用[/url][/f ...
java线程内存模型,线程、工作内存、主内存 -
极乐君:
厉害了,,,请问可以转载到我们专栏吗?会注明来源和地址的~专栏 ...
java线程内存模型,线程、工作内存、主内存 -
zdd001:
Spring 线程池使用 -
zdd001:
Spring 线程池使用 -
u014663756:
看了三行就知道是我想要的!!
java线程内存模型,线程、工作内存、主内存
CyclicBarrier
[java] view plaincopy
- import java.util.concurrent.CyclicBarrier;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- /**
- * @author amber2012
- *
- * CyclicBarrier:
- * 表示线程彼此等待,等所有的线程都集合后,才开始做任务
- *
- */
- public class CyclicBarrierTest {
- public static void main(String[] args) {
- ExecutorService service = Executors.newCachedThreadPool();
- final CyclicBarrier cb = new CyclicBarrier(3);
- for(int i=0;i<3;i++){
- Runnable runnable = new Runnable(){
- public void run(){
- try {
- Thread.sleep((long)(Math.random()*10000));
- System.out.println("线程" + Thread.currentThread().getName() +
- "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
- cb.await();
- Thread.sleep((long)(Math.random()*10000));
- System.out.println("线程" + Thread.currentThread().getName() +
- "即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
- cb.await();
- Thread.sleep((long)(Math.random()*10000));
- System.out.println("线程" + Thread.currentThread().getName() +
- "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
- cb.await();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- };
- service.execute(runnable);
- }
- service.shutdown();
- }
- }
CountDownLatch:
[java] view plaincopy
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- /**
- * @author amber2012
- *
- * CountDownLatch:
- * 好比倒计时计数器,调用CountDownLatch对象的CountDown方法就将计数器减1,当计数器到达0时,则所有等待线程
- * 或单个等待线程开始执行。
- */
- public class CountdownLatchTest {
- public static void main(String[] args) {
- ExecutorService service = Executors.newCachedThreadPool();
- // 创建两个计数器,cdOrder的初始值为1,cdAnswer初始值为3
- final CountDownLatch cdOrder = new CountDownLatch(1);
- final CountDownLatch cdAnswer = new CountDownLatch(3);
- for(int i=0;i<3;i++){
- Runnable runnable = new Runnable(){
- public void run(){
- try {
- System.out.println("线程" + Thread.currentThread().getName() + "正准备接受命令");
- cdOrder.await(); // 所有的线程都在此等待,并希望被其他线程调用cdOrder.countDown()激活,在这里由主线程激活
- System.out.println("线程" + Thread.currentThread().getName() + "已接受命令");
- Thread.sleep((long)(Math.random()*10000));
- System.out.println("线程" + Thread.currentThread().getName() + "回应命令处理结果");
- cdAnswer.countDown();// cdAnswer计数器的初始值为3,,三个线程到达后调用cdAnswer.countDown()到计数为0,激活主线程
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- };
- service.execute(runnable);
- }
- try {
- Thread.sleep((long)(Math.random()*10000));
- System.out.println("线程" + Thread.currentThread().getName() + "即将发布命令");
- cdOrder.countDown();// 主线程将cdOrder计数器减1
- System.out.println("线程" + Thread.currentThread().getName() + "已发送命令,正在等待结果");
- cdAnswer.await();// 主线程正在等待,希望被其他线程激活
- System.out.println("线程" + Thread.currentThread().getName() + "已收到所有响应结果");
- } catch (Exception e) {
- e.printStackTrace();
- }
- service.shutdown();
- }
- }
Exchanger:
[java] view plaincopy
- import java.util.concurrent.Exchanger;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- /**
- * @author amber2012
- *
- * Exchanger:
- * 用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二
- * 个人拿着数据到来时,才能彼此交换数据。
- */
- public class ExchangerTest {
- public static void main(String[] args) {
- ExecutorService service = Executors.newCachedThreadPool();
- final Exchanger exchanger = new Exchanger();
- service.execute(new Runnable(){
- public void run() {
- try {
- String data1 = "zxx";
- System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 +"换出去");
- Thread.sleep(1000L);
- String data2 = (String)exchanger.exchange(data1);
- System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2);
- }catch(Exception e){
- }
- }
- });
- service.execute(new Runnable(){
- public void run() {
- try {
- String data1 = "lhm";
- System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 +"换出去");
- Thread.sleep(2000L);
- String data2 = (String)exchanger.exchange(data1);
- System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2);
- }catch(Exception e){
- }
- }
- });
- }
- }
发表评论
-
Spring 线程池使用2
2013-04-25 18:41 1148<!-- 配置异步线程执行器 --> < ... -
java synchronized与lock区别 转
2013-03-20 01:59 1053java synchronized与lock区别 ... -
java并发编程实践笔记(转)
2012-11-28 01:14 934一、 保证线程安全的 ... -
并发集合类ConcurrentSkipListSet
2012-11-24 03:26 5618ConcurrentSkipListSet Concu ... -
Amdahl 定律 (阿姆达尔定律)
2012-11-24 02:14 2066有些问题使用越多的资源就能越快地解决——越多的工人参 ... -
java线程内存模型,线程、工作内存、主内存
2012-11-24 02:08 18187java线程内存模型 线程、工作内存、主内存三者之间的 ... -
线程同步与异步
2012-11-22 23:53 2476Java中的线程同步与 ... -
Java 并发核心编程(转)
2012-11-06 10:16 1022Java 并发核心编程(转) Java 并发核心编程 ... -
java线程:关于Callable和Future的简单使用:有返回值的线程
2012-11-06 09:19 1965分类: java_线程2012-07-03 19 ... -
java数据结构:ConcurrentSkipListSet<E>与CopyOnWriteArraySet<E>
2012-11-06 09:20 5863分类: java_数据结构 java_线程201 ... -
java线程:信号量
2012-11-06 09:20 884Java 信号量 Semaphore 介绍 Semaphore ... -
java线程:一个死锁的小程序
2012-11-06 09:20 2701死锁是这样一种 ... -
java线程:互斥锁与读写锁
2012-11-05 17:34 7050java线程:互斥锁与读写锁 分类: ja ... -
java线程:三种方式实现生产者消费者问题_3
2012-11-05 17:34 1307java线程:三种方式 ... -
java线程:三种方式实现生产者消费者问题_2
2012-11-05 14:26 1122java线程:三种方式实现生产者消费者问题_2 ... -
java线程:三种方式实现生产者消费者问题_1
2012-11-05 14:22 1149java线程:三种方式实现生产者消费者问题_1 ... -
java ExecutorService 线程池Callable 和 Future接口
2012-08-29 21:10 1169javaEye转载(java多线程 Callable 的实现) ... -
线程并发
2012-03-31 15:41 10421:>内存模型 究竟什么是内存模型?内存模型描述了程序中 ... -
特殊的队列:BlockingQueue 使用(转)
2012-03-28 14:49 1061本例介绍一个特殊的队列:BlockingQueue,如果Blo ... -
Spring 线程池使用
2012-03-28 12:47 26087Spring 线程池使用 /** * */ 一个日志管理 ...
相关推荐
Java线程错误捕获工具CheckThread是一个用于监控和管理Java应用程序中线程异常的重要工具。在多线程编程中,由于并发执行的特性,错误处理变得复杂,有时异常可能不会立即抛出,而是隐藏在后台线程中,导致程序运行...
通过使用`Callable`接口和`FutureTask`类,Java线程可以返回结果。这种方式比传统使用`Thread`类更加灵活。 #### 十四、Java线程:新特征-锁(上) Java提供了一套高级的锁机制,如`ReentrantLock`,这允许更精细...
Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法,以及`java.util.concurrent`包下的各种高级并发工具类,如`Semaphore`, `CountDownLatch`, `CyclicBarrier`等。...
5. **并发工具类**:如CountDownLatch、CyclicBarrier、Semaphore和Future,这些工具类提供了更高级别的同步和协调机制。 6. **死锁**:当两个或更多线程相互等待对方释放资源时,可能会出现死锁现象,学习如何预防...
随着Java版本的更新,Java也引入了新的并发工具类,例如java.util.concurrent包下的并发集合、原子操作类以及各种并发控制类,这些工具类提供了比传统synchronized和volatile关键字更强大、更灵活的线程同步控制机制...
4. **并发工具类**:Java的并发包(java.util.concurrent)包含许多高效并发工具,如CountDownLatch、CyclicBarrier、Future和Callable,它们在多线程编程中扮演重要角色。 5. **并发集合**:线程安全的集合类,如...
在具体使用时,开发者可以实例化这个工具类,设置必要的参数(如文件路径、线程数、断点位置等),然后调用相应的方法开始传输操作。 总之,多线程断点续传工具类是提高大文件传输效率和可靠性的有效手段,它结合了...
然而,为了更好地管理和控制线程,Java并发包提供了如`ExecutorService`、`Future`、`Callable`等高级接口和类,它们简化了多线程编程,并提供了更好的资源管理。 在处理数据库数据时,我们通常会使用JDBC(Java ...
针对数据量较大的场景,本文介绍的多线程分页查询方案主要包含以下几个步骤: - **步骤1:计算总记录数**。首先通过执行一个统计查询语句获取总的记录数,为后续的分页提供依据。 - **步骤2:设置页面信息**。根据...
这篇论文的核心内容可能包括以下几个方面: 1. **多线程基础**:论文可能会首先介绍多线程的基本概念,解释为什么在JAVA中需要使用多线程,以及多线程如何提升程序的执行效率。这部分内容可能会涉及到线程的创建、...
**并发工具类**:Java并发包(`java.util.concurrent`)提供了一系列高级并发工具,如`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)、`CountDownLatch`(倒计时器)和`ExecutorService`等,它们可以帮助开发者...
在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入探讨Java中实现线程间通信的几种主要方法。 1. **共享数据**:最直观的线程间通信方式是通过共享内存空间,即共享变量。只要对共享变量的操作是线程...
在实现这样的工具时,我们需要理解并掌握以下几个关键知识点: 1. **线程与并发**:Java中的多线程是通过`Thread`类或`Runnable`接口来创建和管理的。在下载任务中,每个线程负责下载文件的一部分,多个线程同时...
### Java多线程几个核心概念 #### 一、理解多线程 多线程是一种让程序内部的不同任务或计算能够并发执行的技术。在Java中,多线程的应用极为广泛,可以大大提高程序的效率和响应性。多线程的核心概念包括以下几个...
3. **线程通信**:在多线程环境下,线程间需要进行通信,例如,通过`wait()`, `notify()`, `notifyAll()`方法来协调线程的执行顺序,或者使用`BlockingQueue`等并发工具类实现线程间的同步。 4. **线程优先级**:...
2. 继承`Thread`类:直接创建一个类继承`Thread`,覆盖`run()`方法。创建该类的实例并调用`start()`方法启动线程。 ```java class MyThread extends Thread { public void run() { // 线程执行的代码 } } ...
这个压缩包中的文件提供了几个关于Java多线程交互的实例,可以帮助我们深入理解如何在并发环境中控制线程的同步,确保数据的一致性和安全性。 首先,让我们讨论一下标题和描述中提到的关键概念——“多线程交互”和...
书中可能涵盖了以下几个核心知识点: 1. **线程的概念与分类**:介绍什么是线程,线程如何在操作系统中运行,以及Java中线程的两种创建方式——通过`Thread`类的子类和实现`Runnable`接口。 2. **线程的状态**:...
本篇文章将详细讲解几个Java线程的实例,帮助你深入理解这一关键概念。 首先,我们需要了解Java中的线程创建方式。在Java中,有两种主要的创建线程的方式:继承`Thread`类和实现`Runnable`接口。当继承`Thread`类时...