给定两个列表,使用线程同步之打印1A2B3C4D5E6F7G8H9I10J...
线程同步
- 1.题目解析
- 2.线程同步demo
- 2.1LockSupport Demo
- 2.2自旋 Demo
- 2.3阻塞队列 Demo
- 2.4 synchronized Demo
- 2.5阻塞队列 Demo
- 结果
1.题目解析
循环打印出,肯定需要两个进程,如何保障两个进程有序打印呢?这就涉及到的线程同步问题。
- 使用同步锁的帮助类:LockSupport
两个重要方法
//唤醒指定线程public static void unpark(Thread thread);//阻塞当前进程public static void park();
使用自旋
占用cpu时间;使用阻塞队列: BlockingDeque
// 将指定的元素插入此deque表示的队列中
put(E e);
// 检索并删除此deque表示的队列头
take();
- 使用synchronized,notify,wait
- 使用lock,condition;
//使用condition必须先lock();
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();// 唤醒一个等待线程。该线程从等待方法返回前必须获得与Condition相关的锁。condition.signal();// 造成当前线程在接到信号或被中断之前一直处于等待状态condition.wait();
2.线程同步demo
2.1LockSupport Demo
public clsaa Demo {static Thread t1= null;static Thread t2 = null;public static void main(String[] args) throws InterruptedException {List<Integer> numberList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26);List<String> stringList = Lists.newArrayList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");List<String> resultList = Lists.newArrayListWithExpectedSize(numberList.size()+stringList.size());t1 = new Thread(() -> {for (Integer integer : numberList) {resultList.add(String.valueOf(integer));//唤醒指定阻塞线程LockSupport.unpark(t2);//阻塞当前线程LockSupport.park();}});t2 = new Thread(() -> {for (String str : stringList) {//阻塞当前线程LockSupport.park();resultList.add(str);//唤醒指定阻塞线程LockSupport.unpark(t1);}});t1.start();t2.start();//阻塞主线程一会Thread.sleep((long) (10 * 10));System.out.println(resultList);System.out.println(resultList.stream().collect(Collectors.joining()));}
}
2.2自旋 Demo
public clsaa Demo {static Thread t1= null;static Thread t2 = null;enum ThreadToRun {T1, T2}static volatile ThreadToRun threadToRun = ThreadToRun.T1;public static void main(String[] args) throws InterruptedException {List<Integer> numberList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26);List<String> stringList = Lists.newArrayList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");List<String> resultList = Lists.newArrayListWithExpectedSize(numberList.size() + stringList.size());t1 = new Thread(() -> {for (Integer integer : numberList) {//如果不是T1线程,就一直循环while (threadToRun != ThreadToRun.T1) {}resultList.add(String.valueOf(integer));threadToRun = ThreadToRun.T2;}});t2 = new Thread(() -> {for (String str : stringList) {while (threadToRun != ThreadToRun.T2) {}resultList.add(String.valueOf(str));threadToRun = ThreadToRun.T1;}});t1.start();t2.start();//阻塞主线程一会Thread.sleep((long) (10 * 100));System.out.println(resultList);System.out.println(String.join("", resultList));}
2.3阻塞队列 Demo
2.4 synchronized Demo
public static void main(String[] args) throws InterruptedException {List<Integer> numberList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26);List<String> stringList = Lists.newArrayList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");List<String> resultList = Lists.newArrayListWithExpectedSize(numberList.size() + stringList.size());Object o = new Object();t1 = new Thread(() -> {synchronized (o) {for (Integer integer : numberList) {resultList.add(String.valueOf(integer));try {//唤醒队列中的一个线程o.notify();//进入等待队列,当前线程让出锁o.wait();} catch (Exception e) {}}o.notify();}});t2 = new Thread(() -> {synchronized (o) {for (String str : stringList) {resultList.add(str);try {//唤醒队列中的一个线程o.notify();//进入等待队列,当前线程让出锁o.wait();} catch (Exception e) {}}//必须,否则程序无法停止o.notify();}});t1.start();t2.start();//阻塞主线程一会Thread.sleep((long) (10 * 100));System.out.println(resultList);System.out.println(String.join("", resultList));}
2.5阻塞队列 Demo
结果
给定两个列表,使用线程同步之打印1A2B3C4D5E6F7G8H9I10J...相关推荐
- Linux线程同步之条件变量
与互斥锁不同,条件变量是用来等待而不是用来上锁的.条件变量用来自动阻塞一个线程,直到某特殊情况发生为止.通常条件变量和互斥锁同时使用. 条件变量使我们可以睡眠等待某种条件出现.条件变量是利用线程间共享 ...
- [转]Linux线程同步之条件变量
与互斥锁不同,条件变量是用来等待而不是用来上锁的.条件变量用来自动阻塞一个线程,直到某特殊情况发生为止.通常条件变量和互斥锁同时使用. 条件变量使我们可以睡眠等待某种条件出现.条件变量是利用线程间共享 ...
- 线程同步-生产者消费者问题
在进行多线程编程时,难免还要碰到两个问题,那就线程间的互斥与同步: 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才 ...
- Linux多线程之线程同步
线程最大的特点就是资源的共享性,所以也就有了一个难点线程同步,实现线程同步的方法最常用的方法是:互斥锁,条件变量和信号量.接下来就让我们来看下这几种同步的方法. 一.互斥锁(Mutex) 获得锁的线程 ...
- linux c 线程同步的三种方法
目录 一.互斥锁(mutex) 二.条件变量(cond) 三.信号量(sem) 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用 ...
- Linux 线程同步的三种方法
程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同 ...
- Linux C线程同步的三种方法
void* thr_fn1() {printf ("111111"); }int main() {int err;pthread_t tid;void *tret;err = pt ...
- python列表两两组合_关于python:两个列表之间的组合?
已经有一段时间了,我很难用我正在尝试的算法来概括我的想法.基本上,我有两个列表,想要得到这两个列表的所有组合. 我可能解释不正确,所以这里举个例子. name = 'a', 'b' number = ...
- linux线程同步的方法
#Linux 线程同步的三种方法 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. ##一.互斥锁 ...
最新文章
- 神经网络通用近似定理
- git clone 几种可选参数的使用与区别
- JQuery 自动触发 a 标签的 click事件
- MVC简捷调用EasyUI的datagrid
- Maven开发笔记(四)—— Maven中plugins和pluginManagement
- Python Twisted 介绍
- java mvc页面传值方式_详解SpringMVC的ModelAndView传值方法
- 第0课第2节_刚接触开发板之烧写裸板程序
- 静态方法和类方法之间的区别
- 如何应对当下的 996?
- DataTables之TableTools插件
- c#精彩编程200例百度云_每天宅家创客5分钟|智龙6号星球车:01唤醒星球车——温州中小学趣味信息技术云课程...
- cloudcompare断面提取
- html网页图片自动切换代码,html5图片列表切换浏览模式代码
- 计算两个时间相差多少小时、分钟、秒
- 小微企业都在用的一体化管理解决方案
- 深富策略:罕见巨额成交量背后蕴含深意
- ISCSLP 2022 | AccentSpeech—从众包数据中学习口音来构建目标说话人的口音语音合成系统
- python改变列的数据类型_更改Pandas中列的数据类型
- Java基础笔记:Day_10 接口、匿名内部类