java多线程循环打印abc,使用java多线程顺序打印“ABCABC”
一、几个基本概念的区分 1.进程与程序的区分 程序 进程 包含代码部分、数据部分 包含代码部分、数据部分、进程控制块 顺序执行 并发执行 独占资源 共享资源 同步的 异步的 静态的 动态的 (本质区别) 2.线程与进程的关系 相同:线程是轻量级的进程,一个进程
今天看到这么一道多线程题:有三个线程,每个线程有一个属性flag,假设每个线程的flag值顺序为“A”、“B”、“C”,编写一段代码在控制台顺序输出“ABCABC”。
因为线程执行不是按顺序执行的,如果需要按顺序执行,则需要加锁。现在设想有一个对象“lock”作为这三个线程共用的锁,“lock”控制每个线程的“输出flag值到控制台”的代码。每个线程在start后,在开始说正事之前我先给大家介绍一下这份代码的背景,以免大家有一种雾里看花的感觉。在本系列的前几篇博客中有一篇是用多线程进行百度图片的抓取,但是当时使用的多线程是非常粗略的,只是开了几个线程让抓取的速度提升了一些(其实提升了很多),初步的使用都需要去检查是否获得了”lock“的锁(锁的分配是都虚拟机分配的,貌似),如果获得了锁,则执行相关代码,如果没有获得锁,则挂起,等待系统下次调用。
示例代码
package com.jrkui.thread;
public class OrderPrintThread extends Thread{
private Lock lock;
private String flag;
public OrderPrintThread(String flag, Lock lock) {
this.flag = flag;
this.lock = lock;
}
@Override
public void run() {
int count = 2;
while(count > 0)
{
synchronized (lock) {
if(lock.getFlag().equals(flag))
{
System.out.print(flag);
count--;
if("A".equals(flag))
lock.setFlag("B");
else if("B".equals(flag))
lock.setFlag("C");
else if("C".equals(flag))
lock.setFlag("A");
}
}
}
}
public static void main(String[] args) {
Lock lock = new Lock();
lock.setFlag("A");
OrderPrintThread thread1 = new OrderPrintThread("A", lock);
OrderPrintThread thread2 = new OrderPrintThread("B", lock);
OrderPrintThread thread3 = new OrderPrintThread("C", lock);
thread1.start();
thread2.start();
thread3.start();
}
}
class Lock
{
private String flag;
public void setFlag(String flag) {
this.flag = flag;
}
public String getFlag() {
return flag;
}
}
synchronized关键字就是为”lock“对象加锁。加上synchronized关键字后,每次只能有一个线程调用被加锁的代码段(变量,方法)。
java多线程循环打印abc,使用java多线程顺序打印“ABCABC”相关推荐
- linux多线程顺序打印abc,c++11 多线程依次打印ABC
并发 练习代码 #include #include #include #include using namespace std; std::mutex mtx; std::condition_vari ...
- java for循环_愉快地学Java语言:第五章 循环
导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇,如果 ...
- 打印list_按之字形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路及代码 这题是 LiShun:把二叉 ...
- java 遍历循环_如何在Java中实现循环遍历?
我想对以下元素进行循环: [1,2,11,12,21,22111112121122,-,2222222] 或者例如 [1,2,3,11,12,13,21,22,23,31,32,33111111211 ...
- java for循环定义变量,在java语言里for循环里的变量如何声明在外面进行使用。
在java语言里for循环里的变量如何声明在外面进行使用. 关注:142 答案:2 手机版 解决时间 2021-02-01 21:59 提问者懷念那年夏天 2021-01-31 21:11 pub ...
- java 正负循环_为什么递增Java int最终导致负数?
我试图检查不同的输入并在java中创建无限循环,我发现一旦int超过最大限制递增,它就会变成负数-2147482958. 我只是在无限循环中增加int ... 码: public static voi ...
- java如何循环输出一个表格,Java编程for循环输出俄文字母表
课本上的一个例题.奇葩的是问题出在"a"上,貌似,俄文的"а"和英文的"a"长的差不多哇,开始的时候居然是从ASCII表的97号开始的,后来 ...
- 三个线程轮流执行顺序打印ABC
方法1:使用boolean标记 package com.ziyear.exam;/*** 3个线程,顺序打印ABC10次*/ public class PrintThread_ABC_10_1 {/* ...
- java多线程交替打印abc
你可以使用 synchronized 和 wait / notify 来实现多线程交替打印abc. 以下是一个示例代码: public class PrintABC {private intstate ...
最新文章
- 在启动activity之前,调用application的oncreate
- Flask 教程 第十三章:国际化和本地化
- js 页面跳转保存状态
- 回调函数_实用程序类与函数式编程无关
- Spring boot 和Vue开发中CORS跨域问题
- 在电脑桌面 右键点击 计算机,在桌面上右键点击电脑
- [css] 简述下你理解的优雅降级和渐进增强
- 工资低是浪费生命?俞敏洪:当你工资比同学少一半 生命已经浪费一半
- 免安装mysql配置图解_mysql免安装版配置步骤详解分享
- 动态字符串的存储结构的实现
- [DB]MYSQL外键(Foreign Key)的使用(转载)
- tim指定保存云服务器_腾讯 TIM 迎来重大版本更新 新增独立的云文件功能
- PAT 1009 蜜蜂寻路
- java玫瑰花代码_玫瑰花c语言代码
- [内网渗透]—NetLogon 域内提权漏洞(CVE-2020-1472)
- 修改计算机管理员密码,该怎么改电脑administrator密码
- Java面试题(自己不会的查大佬的贴,持续记录中)
- plc采用计算机结构如何理解,PLC课后习题答案
- 进销存管理系统和ERP的工作原理和实现方式有何不同?
- 呕心沥血整理的 3Dmax教程 快捷键大全,来粘贴拿走!