`

并发同步列子

 
阅读更多
import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest {
	public static void main(String[] args) {
		final CountDownLatch latch = new CountDownLatch(2);

		new Thread() {
			public void run() {
				try {
					System.out.println("子线程" + Thread.currentThread().getName() + "正在执行");
					Thread.sleep(3000);
					System.out.println("子线程" + Thread.currentThread().getName() + "执行完毕");
					latch.countDown();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			};
		}.start();

		new Thread() {
			public void run() {
				try {
					System.out.println("子线程" + Thread.currentThread().getName() + "正在执行");
					Thread.sleep(3000);
					System.out.println("子线程" + Thread.currentThread().getName() + "执行完毕");
					latch.countDown();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			};
		}.start();

		try {
			System.out.println("等待2个子线程执行完毕...");
			latch.await();
			System.out.println("2个子线程已经执行完毕");
			System.out.println("继续执行主线程");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}





import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest {
	// 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
	final CyclicBarrier barrier;

	// 线程数
	int count;

	class Worker implements Runnable {
		int index;

		Worker(int index) {
			this.index = index;
		}

		public void run() {
			System.out.println("第" + index + "个线程休眠" + (2 * index) + "秒!");
			try {
				Thread.sleep(2000 * index);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("第" + index + "个线程结束休眠!");

			try {
				// 等待其它线程都处理完毕后,再继续以下代码的执行
				barrier.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}

			System.out.println("=========" + index);
		}
	}

	public CyclicBarrierTest(int count) {
		this.count = count;

		// 公共屏障点 等待到5个线程后,执行相应的barrierAction
		barrier = new CyclicBarrier(count, new Runnable() {
			public void run() {
				System.out.println("全部线程已执行完毕!");
			}
		});

		for (int i = 1; i <= this.count; i++) {
			new Thread(new Worker(i)).start();
		}
	}

	public static void main(String[] args) {
		new CyclicBarrierTest(5);
	}
}



import java.util.concurrent.Semaphore;

public class SemaphoreTest {
    public static void main(String[] args) {
        int N = 8;            //工人数
        Semaphore semaphore = new Semaphore(5); //机器数目
        for(int i=0;i<N;i++)
            new Worker(i,semaphore).start();
    }
     
    static class Worker extends Thread{
        private int num;
        private Semaphore semaphore;
        public Worker(int num,Semaphore semaphore){
            this.num = num;
            this.semaphore = semaphore;
        }
         
        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println("工人"+this.num+"占用一个机器在生产...");
                Thread.sleep(2000);
                System.out.println("工人"+this.num+"释放出机器");
                semaphore.release();           
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
分享到:
评论

相关推荐

    多线程列子

    在Windows操作系统中,每个线程都有自己的执行上下文,使得程序可以在等待I/O操作完成或执行耗时任务时,仍然能处理其他任务,提高了程序的并发性和资源利用率。 二、创建线程 在C#中,有两种主要方式创建线程: 1....

    c#多线程源码列子

    在单线程程序中,所有操作按顺序执行,而在多线程程序中,多个线程可以并发执行,提高系统资源利用率。 2. 主线程与子线程:主线程是程序启动时自动创建的线程,而子线程是程序员手动创建的线程。子线程用于执行...

    进程通信的小列子

    进程通信是操作系统中一个至关重要的概念,它是指在操作系统中两个或多个并发执行的进程之间交换信息的过程。在这个“进程通信的小例子”中,我们将会探讨如何实现这种通信,以及它在实际应用中的意义和作用。 首先...

    多线程列子多线程列子多线程列子

    1. 线程安全:多线程环境下,数据的并发访问可能导致数据不一致,需要同步机制来保证线程安全。 2. 资源消耗:每个线程都需要一定的系统资源,过多的线程可能导致资源浪费。 3. 线程上下文切换:在多线程运行过程中...

    VC 聊天列子

    客户端首先发送SYN(同步序列编号)报文段到服务器,服务器回应SYN+ACK(同步确认),最后客户端再次发送ACK(确认)报文段,完成连接建立。在这个聊天程序中,每个用户需要先与服务器建立TCP连接才能进行通信。 2....

    多线程起步,总结的,一些方法的使用,简单的列子,使用方法

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在Java这种支持多线程的高级语言中。本文将深入探讨多线程的基础知识,包括它的概念、使用场景、核心方法以及通过简单示例来帮助初学者理解多线程的实践操作...

    网名采集学习列子-易语言

    易语言提供了多线程支持,理解如何创建和管理线程,以及处理并发中的同步问题,是提高程序性能的关键。 6. **异常处理**:网络请求可能出现各种错误,如网络中断、超时、重定向等。编写健壮的代码需要包含适当的...

    Collection 详细案例,集合的详细例子,list例子和详细解析,map详细例子和详细解析,set详细列子和详细解析,

    然而,由于其同步性质,Vector在单线程环境中的性能可能不如ArrayList。案例会对比ArrayList和Vector的使用,以及如何在需要线程安全时选择Vector。 Map接口是键值对的集合,最常用的实现包括HashMap、TreeMap等。...

    简单的多线程列子-易语言

    在易语言中,通过创建和管理线程,可以实现并发操作,提高程序响应速度和资源利用率。 创建线程在易语言中主要通过“创建线程”命令来实现。这个命令需要传递一个代码块作为参数,这个代码块将在新的线程中运行。...

    C++多线程例子

    尤其是在处理大量并发操作或者需要充分利用现代多核处理器能力时,多线程显得尤为重要。本教程将深入探讨C++中的多线程编程,并提供一个基础的例子。 C++11标准引入了对多线程的支持,通过`&lt;thread&gt;`库提供了线程...

    100个C#实例程序例子 源码

    11. **多线程**:理解并发和多线程编程,如何使用Thread类创建并控制线程,以及线程同步的概念。 12. **Windows Forms**:如果实例中包含GUI编程,那么会介绍Windows Forms的使用,如控件的添加、属性设置、事件...

    java编程100例,有很多的例子。

    - NIO(New Input/Output):非阻塞I/O,提供更高效的数据传输方式,适用于高并发场景。 11. **多线程** - Thread类:创建和管理线程,理解线程生命周期和同步机制。 - Runnable接口:另一种实现多线程的方式,...

    易语言多线程下载不卡速度快

    "调用列子.e"则可能是包含如何调用和使用这个下载模块的示例代码,帮助开发者理解如何将多线程下载功能整合进自己的程序中。 "多线程多任务下载文件.ec"可能是一个易语言的编译文件,用户可以直接运行,无需编译源...

    Java语言程序设计案例教程(课本源代码)

    5. **多线程**:Java内置了多线程支持,开发者可以轻松地创建和管理多个并发执行的任务,从而提高程序的效率。 6. **丰富的库支持**:Java标准库提供了大量的类和接口,涵盖了I/O操作、网络编程、数据库连接、XML...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 9.JAVA并发编程之多线程并发同步业务场景与解决方案.wmv │ │ │ ├─10.微服务架构之Spring Cloud Eureka 场景分析与实战 │ │ 10.微服务架构之Spring Cloud Eureka 场景分析与实战.wmv │ │ │ ├─11....

    易语言-易语言简单的多线程例子

    3. **线程同步与通信**:在多线程环境中,为了防止数据冲突,可能需要使用同步机制,如信号量、互斥量或事件对象。易语言提供了这些工具,使得线程间可以安全地共享资源。 4. **线程管理**:包括等待线程结束(使用...

    Android开发指南中文版

    - **Service**:在后台执行长时间运行的操作,如音乐播放或后台数据同步。 - **Broadcast Receiver**:用于接收广播消息,例如电池电量低的通知。 - **Content Provider**:管理应用程序中的数据,并让这些数据可以...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    列子: 文件内容 9. 显示宽度 (linesize) 说明:设置显示行的宽度,默认是80个字符 用法:set linesize 120 10. 显示页数 (pagesize) 说明:设置每页显示的行数,默认是14页 用法:set pagesize 20 三、 用户...

Global site tag (gtag.js) - Google Analytics