Java多线程经典案例
Java多线程经典案例
1.三个售票窗口同时出售20张票
public class Demo1
{
public static void main(String[] args)
{
TicketOffice ticketOffice = new TicketOffice(new Object(), 20);
new Thread(ticketOffice, "窗口1").start();
new Thread(ticketOffice, "窗口2").start();
new Thread(ticketOffice, "窗口3").start();
}
}
class TicketOffice implements Runnable
{
private Object object;
private int ticketNum;
public TicketOffice(java.lang.Object object, int ticketNum)
{
this.object = object;
this.ticketNum = ticketNum;
}
public void run()
{
while (ticketNum > 0)
{
synchronized (object)
{
if (ticketNum <= 0)
{
System.out.println(Thread.currentThread().getName() + "没有票了");
}
else
{
System.out.println(Thread.currentThread().getName() + "卖出了一张票,剩余" + --ticketNum + "张票");
try
{
Thread.sleep(1000L);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
}
2.创建两个线程,其中一个输出1-52,另外一个输出A-Z。输出格式要求:12A 34B 56C 78D ...
public class Demo2
{
public static void main(String[] args)
{
Object object = new Object();
new Thread(new Number(object)).start();
new Thread(new Character(object)).start();
}
}
class Number implements Runnable
{
private Object object;
public Number(Object object)
{
this.object = object;
}
public void run()
{
synchronized (object)
{
for (int i = 1; i < 53; i++)
{
if (i > 1 && i % 2 == 1)
{
System.out.print(" ");
}
System.out.print(i);
if (i % 2 == 0)
{
object.notifyAll();
try
{
object.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
}
class Character implements Runnable
{
private Object object;
public Character(Object object)
{
this.object = object;
}
public void run()
{
synchronized (object)
{
for (char i = 'A'; i <= 'Z'; i++)
{
System.out.print(i);
object.notifyAll();
if (i < 'Z')
{
try
{
object.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
}
3.
启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20….以此类推, 直到打印到75. 程序的输出结果应该为:
线程1: 1
线程1: 2
线程1: 3
线程1: 4
线程1: 5
线程2: 6
线程2: 7
线程2: 8
线程2: 9
线程2: 10
…
线程3: 71
线程3: 72
线程3: 73
线程3: 74
线程3: 75
public class Demo3
{
public static void main(String[] args)
{
Object object = new Object();
new Thread(new PrintRunnable(object,1)).start();
new Thread(new PrintRunnable(object,2)).start();
new Thread(new PrintRunnable(object,3)).start();
}
}
class PrintRunnable implements Runnable
{
private static volatile int printNum = 0;
private Object object;
private int threadId;
public PrintRunnable(Object object, int threadId)
{
super();
this.object = object;
this.threadId = threadId;
}
public void run()
{
while (printNum < 75)
{
synchronized (object)
{
if (printNum / 5 % 3 + 1 == threadId)
{
for (int i = 0; i < 5; i++)
{
System.out.println("线程" + threadId + ":" + (++printNum));
}
object.notifyAll();
}
else
{
try
{
object.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
}
原文地址https://blog.csdn.net/xixiangdeshaonian/article/details/82228492
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python版解决中文字符串错误
Python版解决中文字符串错误 在制作工具时使用到了中文字符,结果出现了错误。网上搜索了各种方法仍然无效,最后通过多次的debug和尝试才解决。为此写下来做为参考。 系统为Ubuntu1404,安装了Python 2.7.6和Python 3.4.3。具体的代码如下: name = "签名文件.png" print(name) 1 2 3 4 把该代码保存到code.py文件中,然后运行,出错的信息如下: $ python code.py File "code.py", line 2 SyntaxError: Non-ASCII character '\xe7' in file code.py on line 23, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 1 2 3 4 5 6 解决方法就是在文件开关加入以下声明: #coding=utf8 1 该声明告诉编译器源代码文件使用utf-8格式进行编码。 该方法的原理在于python2默认使用ASCII编码格式,...
- 下一篇
webpack4.0各个击破(6)—— Loader篇
webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高。本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决方式的模式,以前端构建中遇到的具体需求为出发点,学习webpack工具中相应的处理办法。(本篇中的参数配置及使用方式均基于webpack4.0版本) 一. loader综述 loader是webpack的核心概念之一,它的基本工作流是将一个文件以字符串的形式读入,对其进行语法分析及转换(或者直接在loader中引入现成的编译工具,例如sass-loader中就引入了node-sass将SCSS代码转换为CSS代码,再交由css-loader处理),然后交由下一环节进行处理,所有载入的模块最终都会经过moduleFactory处理,转成javascript可以识别和运行的代码,从而完成模块的集成。 loader支持链式调用,所以开发上需要严格遵循“单一职责”原则,即每个loader只负责自己需要负责的事情:将输入信息进行处理,并输出为下一个loader可识别的格式。 实际开发中,很少会出现需要自己写loader来实现复杂需求的场景,如果某个扩展名...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Mario游戏-低调大师作品
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能