java 多线程 数据通信
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 多线程 数据通信的更多相关文章
- Java 多线程 锁 存款 取款
http://jameswxx.iteye.com/blog/806968 最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: ja ...
- Java 多线程1(转载)
来源:http://hllvm.group.iteye.com/group/wiki/2877-synchronized-volatile 最近想将java基础的一些东西都整理整理,写下来,这是对知识 ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- Java多线程 2 线程的生命周期和状态控制
一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...
- java 多线程 1 线程 进程
Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报 分类: javaSE综合知识点(14) 版权声明:本文为博主原创文章,未经博 ...
- 一起阅读《Java多线程编程核心技术》
目录 第一章 Java多线程技能 (待续...)
随机推荐
- oracle WMSYS.WM_CONCAT 函数使用
1.用法 WMSYS.WM_CONCAT(要连接的字段) 该函数返回来自同一个分组的指定字段的非NULL值的连接起来字符串,默认逗号连接,一般搭配分组函数使用 2.示例 select XFJ_ID,R ...
- (四十二)Unittest单元测试框架之关于unittest还需要知道的-跳过测试和预期失败
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...
- 为什么常用Formdata对象来上传图片
一.上传的数据体格式Content-Type 1.application/x-www-form-urlencoded 2.application/json 3.multipart/form-data ...
- nginx调试和location用法,匹配url
1.nginx调试输出内容到页面 location = /demo { charset utf-8; default_type text/html; return 500 "服务正在升级,请 ...
- laravel 表单提交 图片的异步上传
这里使用的是WebUploader 百度提供的插件 首先下载最新的包 下载第一个,解压,把解压好的文件放入public目录下 视图层中 <div class="formContro ...
- Centos系统修改时间临时和永久生效
Centos系统,必须同时修改系统时间和硬件时间,才可以保证修改有效,单纯的使用date命令修改系统时间,是立即生效,重启后系统还原.具体操作如下: 1.date命令 {查看和修改目前系统本地的时间} ...
- PAT-basic-1023 组个最小数 java
一.题目 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的 ...
- DockerCompose
- 替代学习物联网-云服务-02阿里云MQTT
1.支付宝登录,进入物联网平台 https://iot.console.aliyun.com/product 2.新建产品 3.添加设备 4.设备连接参数 5.连接到阿里云
- MarkDown学习笔记1
# MarkDown学习(一级标题)## 标题(二级)### 三级标题#### 四级标题## 字体*Hello,World!斜体***Hello,World!加粗*****Hello,World!加粗 ...