一、几个基本概念的区分 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”相关推荐

  1. linux多线程顺序打印abc,c++11 多线程依次打印ABC

    并发 练习代码 #include #include #include #include using namespace std; std::mutex mtx; std::condition_vari ...

  2. java for循环_愉快地学Java语言:第五章 循环

    导读 本文适合Java入门,不太适合Java中高级软件工程师.本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述.本篇文章只是这个系列中的一篇,如果 ...

  3. 打印list_按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 解题思路及代码 这题是 LiShun:把二叉 ...

  4. java 遍历循环_如何在Java中实现循环遍历?

    我想对以下元素进行循环: [1,2,11,12,21,22111112121122,-,2222222] 或者例如 [1,2,3,11,12,13,21,22,23,31,32,33111111211 ...

  5. java for循环定义变量,在java语言里for循环里的变量如何声明在外面进行使用。

    在java语言里for循环里的变量如何声明在外面进行使用. 关注:142  答案:2  手机版 解决时间 2021-02-01 21:59 提问者懷念那年夏天 2021-01-31 21:11 pub ...

  6. java 正负循环_为什么递增Java int最终导致负数?

    我试图检查不同的输入并在java中创建无限循环,我发现一旦int超过最大限制递增,它就会变成负数-2147482958. 我只是在无限循环中增加int ... 码: public static voi ...

  7. java如何循环输出一个表格,Java编程for循环输出俄文字母表

    课本上的一个例题.奇葩的是问题出在"a"上,貌似,俄文的"а"和英文的"a"长的差不多哇,开始的时候居然是从ASCII表的97号开始的,后来 ...

  8. 三个线程轮流执行顺序打印ABC

    方法1:使用boolean标记 package com.ziyear.exam;/*** 3个线程,顺序打印ABC10次*/ public class PrintThread_ABC_10_1 {/* ...

  9. java多线程交替打印abc

    你可以使用 synchronized 和 wait / notify 来实现多线程交替打印abc. 以下是一个示例代码: public class PrintABC {private intstate ...

最新文章

  1. 在启动activity之前,调用application的oncreate
  2. Flask 教程 第十三章:国际化和本地化
  3. js 页面跳转保存状态
  4. 回调函数_实用程序类与函数式编程无关
  5. Spring boot 和Vue开发中CORS跨域问题
  6. 在电脑桌面 右键点击 计算机,在桌面上右键点击电脑
  7. [css] 简述下你理解的优雅降级和渐进增强
  8. 工资低是浪费生命?俞敏洪:当你工资比同学少一半 生命已经浪费一半
  9. 免安装mysql配置图解_mysql免安装版配置步骤详解分享
  10. 动态字符串的存储结构的实现
  11. [DB]MYSQL外键(Foreign Key)的使用(转载)
  12. tim指定保存云服务器_腾讯 TIM 迎来重大版本更新 新增独立的云文件功能
  13. PAT 1009 蜜蜂寻路
  14. java玫瑰花代码_玫瑰花c语言代码
  15. [内网渗透]—NetLogon 域内提权漏洞(CVE-2020-1472)
  16. 修改计算机管理员密码,该怎么改电脑administrator密码
  17. Java面试题(自己不会的查大佬的贴,持续记录中)
  18. plc采用计算机结构如何理解,PLC课后习题答案
  19. 进销存管理系统和ERP的工作原理和实现方式有何不同?
  20. 呕心沥血整理的 3Dmax教程 快捷键大全,来粘贴拿走!

热门文章

  1. kd-tree理论以及在PCL 中的代码的实现
  2. 强化学习(二)- 动态规划(Dynamic Programming)
  3. 一行代码解决对象数组排序(sort)
  4. 【请求后台接口】30秒完成Angular10精简版HttpClient请求服务搭建
  5. libcurl+ncurses 分段range批量下载和进度条显示源码实例
  6. gdb常用调试命令汇总!
  7. Blender写实产品创作学习教程
  8. UE4创建第一人称射击游戏学习教程
  9. leetcode-386 字典序排数
  10. windows下rpc框架thrift的环境配置