l  休眠唤醒方式:

Object的wait、notify、notifyAll

Condition的await、signal、signalAll

l  CountDownLatch:用于某个线程A等待若干个其他线程执行完之后,它才执行

l  CyclicBarrier:一组线程等待至某个状态之后再全部同时执行

l  Semaphore:用于控制对某组资源的访问权限

Object的wait、notify、notifyAll

public class WaitNotifyRunnable{

private Object obj = new Object();

private Integer i=0;

public void odd() {

while(i<10){

synchronized (obj){

if(i%2 == 1){

System.out.println("奇数:"+i);

i++;

obj.notify();

} else {

try {

obj.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

public void even(){

while(i<10){

synchronized (obj){

if(i%2 == 0){

System.out.println("偶数:"+i);

i++;

obj.notify();

} else {

try {

obj.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

public static void main(String[] args){

final WaitNotifyRunnable runnable = new WaitNotifyRunnable();

Thread t1 = new Thread(new Runnable() {

public void run() {

runnable.odd();

}

}, "偶数线程");

Thread t2 = new Thread(new Runnable() {

public void run() {

runnable.even();

}

}, "奇数线程");

t1.start();

t2.start();

}

}

Condition的await、signal、signalAll

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class WaitNotifyRunnable{

private Lock lock = new ReentrantLock();

private Condition condition = lock.newCondition();

private Integer i=0;

public void odd() {

while(i<10){

lock.lock();

try{

if(i%2 == 1){

System.out.println("奇数:"+i);

i++;

condition.signal();

} else {

condition.await();

}

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

}

public void even(){

while(i<10){

lock.lock();

try{

if(i%2 == 0){

System.out.println("偶数:"+i);

i++;

condition.signal();

} else {

condition.await();

}

} catch (InterruptedException e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

}

public static void main(String[] args){

final WaitNotifyRunnable runnable = new WaitNotifyRunnable();

Thread t1 = new Thread(new Runnable() {

public void run() {

runnable.odd();

}

}, "偶数线程");

Thread t2 = new Thread(new Runnable() {

public void run() {

runnable.even();

}

}, "奇数线程");

t1.start();

t2.start();

}

}

Object和Condition休眠唤醒区别

l  object wait()必须在synchronized(同步锁)下使用,

l  object wait()必须要通过Nodify()方法进行唤醒

l  condition await() 必须和Lock(互斥锁/共享锁)配合使用

l  condition await() 必须通过 signal() 方法进行唤醒

CountDownLatch方式

CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量

每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务

import java.util.concurrent.CountDownLatch;

public class CoachRecerDemo {

private CountDownLatch countDownLatch=new CountDownLatch(3); //设置要等待的运动员

//运动员方法

public void racer(){

//获取线程名

String name=Thread.currentThread().getName();

System.out.println(name+"正在准备....");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(name+"准备完毕");

countDownLatch.countDown();//-1

}

//教练方法

public void coach(){

String name=Thread.currentThread().getName();

System.out.println(name+"等待运动员准备...");

try {

countDownLatch.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("所有运动员就绪,"+name+"开始训练");

}

public static void main(String[] args) {

//1.创建CoachRecerDemo 实例

CoachRecerDemo coachRecerDemo=new CoachRecerDemo();

//2.创建三个线程对象

Thread thread1=new Thread(new Runnable(){

public void run() {

coachRecerDemo.racer();

}

},"运动员1");

Thread thread2=new Thread(new Runnable() {

public void run() {

coachRecerDemo.racer();

}

},"运动员2");

Thread thread3=new Thread(new Runnable() {

public void run() {

coachRecerDemo.racer();

}

},"运动员3");

//3.教练

Thread thread4=new Thread(new Runnable() {

public void run() {

coachRecerDemo.coach();

}

},"教练");

thread4.start();

thread1.start();

thread2.start();

thread3.start();

}

}

CyclicBarrier方式

CyclicBarrier是在java1.5被引入的,存在于java.util.concurrent包下。

CyclicBarrier实现让一组线程等待至某个状态之后再全部同时执行。

CyclicBarrier底层是三个线程同时启动

import java.util.Date;

import java.util.concurrent.BrokenBarrierException;

import java.util.concurrent.CyclicBarrier;

public class ThreeThreadStartDemo {

private CyclicBarrier cyclicBarrier = new CyclicBarrier(3);// 所有参与启动的线程数

public void startThread() {

// 打印线程准备启动

String name = Thread.currentThread().getName();

System.out.println(name + "正在准备...");

// 2.调用CyclicBarriar的await方法等待线程准备完毕

try {

cyclicBarrier.await();

} catch (InterruptedException | BrokenBarrierException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 3.打印线程启动信息

System.out.println(name + "已经启动完毕" + new Date().getTime());

}

public static void main(String[] args) {

final ThreeThreadStartDemo threadStartDemo = new ThreeThreadStartDemo();

Thread thread1 = new Thread(new Runnable() {

public void run() {

threadStartDemo.startThread();

}

});

Thread thread2 = new Thread(new Runnable() {

public void run() {

threadStartDemo.startThread();

}

});

Thread thread3 = new Thread(new Runnable() {

public void run() {

threadStartDemo.startThread();

}

});

thread1.start();

thread2.start();

thread3.start();

}

}

Semaphore方式

Semaphore是在java1.5被引入的,存在于java.util.concurrent包下。

Semaphore用于控制对某组资源的访问权限。

import java.util.concurrent.Semaphore;

public class WorkerMachineDemo {

static class Work implements Runnable {

private int workerNum;

private Semaphore semaphore;

public Work(int workerNum, Semaphore semaphore) {

this.workerNum = workerNum;

this.semaphore = semaphore;

}

public void run() {

// 1.获取机器

// 2.打印工人获取到机器,开始工作

// 3.线程睡眠1000毫秒

// 4.使用完毕

try {

semaphore.acquire();

String name = Thread.currentThread().getName();

System.out.println(name + "获取到机器,开始工作");

Thread.sleep(1000);

semaphore.release();

System.out.println(name + "使用完毕,释放机器!");

} catch (Exception e) {

// TODO: handle exception

}

}

}

public static void main(String[] args) {

int works = 8;

Semaphore semaphore = new Semaphore(3);// 机器数

for (int i = 0; i < works; i++) {

new Thread(new Work(i, semaphore)).start();

}

}

}

sleep和wait区别:

wait和notify区别

wait和notify都是Object中的方法

wait和notify执行前线程都必须获得对象锁

wait的作用是使当前线程进行等待

notify的作用是通知其他等待当前线程的对象锁的线程

java通讯方式_Java线程通讯方式 - osc_63rgy8af的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java脚本项目_java项目部署脚本 - xixingzhe的个人空间 - OSCHINA - 中文开源技术交流社区...

    #!/bin/sh #java export JAVA_HOME=/root/java/jdk #日志目录 export LOG_HOME=`pwd`/ #项目名称 APP_NAME=xxx.jar ...

  2. java 图形 登录_java登录图形界面 - osc_994n5tsc的个人空间 - OSCHINA - 中文开源技术交流社区...

    编写程序,利用JtextField和JpasswordField分别接收用户输入的用户名和密码,并对用户输入的密码进行检验.对于每个用户名有三次密码输入机会. package beizi; impor ...

  3. java 递归死循环_Java递归 - 感觉太煽情的个人空间 - OSCHINA - 中文开源技术交流社区...

    树节点类: package cn.com.tree; public class Node { private Integer id; private Integer parentId; private ...

  4. java网络编程 听_java网络编程 - 亲亲媛的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.TCP/UDP,Socket,Http,Ftp简介 1.TCP/IP是个协议组(主要解决数据如何在网络中传输),可分为三个层次:网络层.传输层和应用层: 网络层:IP协议(支持网间互联的数据报协议 ...

  5. java拼图_JAVA实现拼图游戏 - osc_yozufu01的个人空间 - OSCHINA - 中文开源技术交流社区...

    package org.test; /** * Title: LoonFramework * Description:拼图图像处理[未优化] * Copyright: Copyright (c) 20 ...

  6. java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...

    java基础(2)--运算符详解 自增自减规则 自增自减就是常用的 a = a++ 或者 a = ++a;前者是后缀式,先把a赋值给a,再加一:后者是后缀式,先加一,在赋值给a;而且a++,++a并不 ...

  7. java分装_JAVA 分装 - 战狼6的个人空间 - OSCHINA - 中文开源技术交流社区

    1.private私有化 只能在本类使用 2.提供公有方法来设置和获取属性值 getter setter 构造方法: 1.都是公共的 2.名字和类名一致 3.无返回值 4.不能写void 方法重载: ...

  8. java 写入环境变量_Java环境变量配置 - import_key的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java 环境变量和路径 在 Solaris 系统上,必须先设置 JAVA_HOME 和 PATH 环境变量,Sun Management Center 3.6 安装向导.设置向导和 Java 控制台 ...

  9. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

最新文章

  1. 关于校验规则(Validation Rule)和业务规则(Bussiness Rule)的思考
  2. 结对编程--------四则运算 实验总结2
  3. jQuery 中的 Ajax
  4. 如果想成为一名顶尖的前端,这份书单你一定要收藏!
  5. php修改session生存时间,修改session的过期(生存)时间
  6. pytorch: 在训练中保存模型,加载模型
  7. 《数据结构与算法分析-C语言描述》习题2.6
  8. 一起谈.NET技术,ASP.NET MVC 3 Beta初体验之超酷的Chart
  9. 解决android sdk 无法更新
  10. 【调度问题】基于遗传算法求解公交排班系统matlab源码
  11. 软件测试中的测试进度安排怎么写,测试开发之测试计划
  12. 打喷嚏的龙(dargon)
  13. ASUS AC88U 路由器开机自启方法
  14. xp计算机用户名和密码忘记了怎么办,电脑的XP系统密码被不小心忘记了怎么办?...
  15. miredo - Teredo IPv6 tunneling for Unix
  16. 韩松手机摄影笔记第三课--经营画面的原则
  17. tf.extract_image_patches
  18. Matlab/simulink采样仿真数据(时序)和时间序列的保存
  19. vue3组合式api
  20. Python 中删除文件的几种方法|好用

热门文章

  1. C++时间库 chrono
  2. 高精度定位系统:地铁隧道人员定位智能巡检
  3. 酷云互动首推以隐私计算为底层的品效协同平台 助力行业发展
  4. 下一代互联网-MetaNet元网的bottle浏览器
  5. 正在配置您的计算机,解决方案:Win10系统正在配置Windows Update并停留在100%,如何解决...
  6. 高可用 高并发 单机介绍以及在不同场景下锁的不同选择
  7. 对话机器人 多轮对话_如何打印短信对话
  8. C++ UDP通信,recvfrom函数一直堵塞
  9. 数学建模 河北杯 无人机侦听与反制问题问题2.2:在未知周期的情况下的解决思路
  10. PHP代码执行漏洞总结大全