1.司机等乘客全部上车后再启动车子

import java.util.concurrent.CountDownLatch;

public class A {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(3);//线程安全 内部是aqs
//倒计数器
for (int i = 97; i <= 100; i++) {
String threadName = String.valueOf((char) i);
new Thread(()->{
if (threadName.equals("d")){
System.out.println(threadName + "正在等待其他线程执行完毕!");
try {
countDownLatch.await();
System.err.println(threadName + "执行!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println(threadName + "执行完啦~~~");
countDownLatch.countDown();
}
}, threadName).start();
}
}
}

2.运动员准备好后通知其他运动员已准备好
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class B {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);//安全有锁
for (int i = 97; i < 100; i++) {
String threadName = String.valueOf((char) i);
new Thread(() -> {
try {
System.out.println(threadName + "已准备!");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.err.println(threadName + "执行!");
}, threadName).start();
}
}
}

3.有返回值的

import java.util.concurrent.*;

public class C {
public static void main(String[] args) {
MyCallable callableA = new MyCallable("AAAAA");
FutureTask<String> futureTask = new FutureTask<>(callableA);
//-----------------------------------------------
String ca = null;
try {
ca = callableA.call();//和下面的run一样
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(ca);//也会阻塞
//-----------------------------------------------
futureTask.run();
try {
String s = futureTask.get();//没有返回结果会阻塞
System.out.println(s);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//-----------------------------------------------
ExecutorService threadPool= Executors.newSingleThreadExecutor();
String plresult = null;
try {
plresult = threadPool.submit(callableA).get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
System.out.println(plresult);
}
}

class MyCallable implements Callable<String>{

private String name;

public MyCallable(String name) {
this.name = name;
}

@Override
public String call() throws Exception {
Thread.sleep(3000);
return this.name;
}
}

4.还有一个不知道这个是干嘛的,感觉用起来很奇怪
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class D {
public static void main(String[] args) {
FutureTask<String> futureTask = new FutureTask<>(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"上边传下边收~~不知道这是干嘛用的~!!!");
futureTask.run();
try {
String s = futureTask.get();
System.out.println(s);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}


java 多线程 数据通信的更多相关文章

  1. Java 多线程 锁 存款 取款

    http://jameswxx.iteye.com/blog/806968 最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: ja ...

  2. Java 多线程1(转载)

    来源:http://hllvm.group.iteye.com/group/wiki/2877-synchronized-volatile 最近想将java基础的一些东西都整理整理,写下来,这是对知识 ...

  3. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  4. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  5. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  6. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  7. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  8. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  9. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  10. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

随机推荐

  1. 全国分乡镇第七次人口普查数据shp数据库省市区县街道

    全国分乡镇第七次人口普查数据shp数据库省市区县街道 ==名称:全国第七次人口普查任意十个乡镇的乡镇界地图==数据说明:精确到乡镇级别.==数据:面数据,属性列表(乡镇名.乡镇代码,第六次人口普查分乡 ...

  2. Twitter Bootstrap Grid System

    Bootstrap是什么?Bootstrap是一个用来快速并且容易的开发web页面,强大的前端框架.它包含html和css基本设计模板,包含通用用户界面组件,如:排版,形式,按钮,表格,导航,下拉框, ...

  3. 安装.msi格式安装包

    msi格式的文件,点右键后,没有"以管理员身份运行"的菜单项,直接运行.msi文件报错:"There is a problem with this Windows Ins ...

  4. 串口USART(续二)

    通过前面的分析知道,在LPC824中,USART所拥有的配置寄存器有很多,但在一般情况下,如果只是简单地使用收发功能,则只需要使用到配置寄存器CFG.波特率发生器寄存器BRG.中断使能读取和置位寄存器 ...

  5. WPFprism框架

    1. Prism 简介Prism 是一个用于构建松耦合.可维护和可测试的 XAML 应用的框架,它支持所有还活着的基于 XAML 的平台,包括 WPF.Xamarin Forms.WinUI 和 ~~ ...

  6. Mysql数据库基础第二章:(十)联合查询

    Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...

  7. python sorted() 多重排序

    前言: 最开始是因为看到一道题目, 用一行代码解决[1, 2, 3, 11, 2, 5, 3, 2, 5, 3] 输出[11, 1, 2, 3, 5] 本来想法很简单,先去重后排序 但是遇到一个难点 ...

  8. CString常用方法简介

    CString常用方法简介 CString::Compare int Compare( LPCTSTR lpsz ) const; 返回值   字符串一样 返回0 小于lpsz  返回-1 大于lps ...

  9. 学习lua-05,io.open 读取输出修改文件,以及io.read的参数运用,读所有,读一行多行

    -- 以附加的方式打开只写文件.若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留.(EOF符保留) file = io.open("D:\\Pr ...

  10. 解决通过Eclipse启动Tomcat-Run On Server无法选择Tomcat v7.0的问题

    在eclipse中配置Tomcat并启动右键项目 -> Run As -> Run on Server可能会出现无法选择Tomcat v7.0的现象如下图,不慌菜鸟小编带你解决!1.定位到 ...