/**
* 多线程案例 两种方式 模拟买票程序(不考虑线程安全问题)
*/
public class ThreadTest {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + " main run start"); //方式1
/**
* 模拟4个售票窗口售票
*/
// Ticket test1 = new Ticket();
// Ticket test2 = new Ticket();
// Ticket test3 = new Ticket();
// Ticket test4 = new Ticket();
// test1.start();
// test2.start();
// test3.start();
// test4.start(); //方式2
TestImpl ti1 = new TestImpl();
TestImpl ti2 = new TestImpl();
TestImpl ti3 = new TestImpl();
TestImpl ti4 = new TestImpl();
new Thread(ti1).start();
new Thread(ti2).start();
new Thread(ti3).start();
new Thread(ti4).start(); System.out.println(Thread.currentThread().getName() + " main run finished");
}
} /**
* 方式1 继承Thread类重写run方法
*/
class Ticket extends Thread {
private static int ticketCount = 100; @Override
public void run() {
while (ticketCount > 0) {
System.out.println(Thread.currentThread().getName() + " extends run tickNum" + ticketCount--);
}
}
} /**
* 方式1 实现Runnable接口
*/
class TestImpl implements Runnable {
private Object obj = new Object();
private static int ticketCount = 100; @Override
public void run() {
while (ticketCount > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
sale();
}
} /**
* 使用同步代码块解决多线程安全问题
*/
public void sale() {
synchronized (this) {
if (ticketCount > 0) {
System.out.println(Thread.currentThread().getName() + "还剩" + (ticketCount) + "张票");
ticketCount--;
}
}
}
}

  

Java 多线程示例的更多相关文章

  1. Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例

    概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)Cyc ...

  2. Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例

    概要 前面对"独占锁"和"共享锁"有了个大致的了解:本章,我们对CountDownLatch进行学习.和ReadWriteLock.ReadLock一样,Cou ...

  3. Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

    概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 ...

  4. 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例

    java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...

  5. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  6. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  7. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  8. Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

    本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...

  9. Java多线程系列--“JUC锁”01之 框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...

随机推荐

  1. 关于 false sharing

    问题来源 在多线程操作中,每个线程对操作对象都会有单独的缓存,最后将缓存同步到内存上,不加锁的话会导致数据缺乏同步出现错误,如果只是简单地加锁,性能就会飞速下降 解法 spacing &&am ...

  2. C#从零单排上王者系列---数据类型

    从零单排系列简介 突然发现自己的基础不是很牢固,就买了一个<C#7.0的本质论>.本系列博客就是以此书为本,记录自己的学习心得,如果你的基础也不牢固,不如跟上博主一起学习成长呀! 本篇博客 ...

  3. Vue.use()源码分析且执行后干什么了

    直接开始分析源码 // Vue源码文件路径:src/core/global-api/use.js import { toArray } from '../util/index' //initUse函数 ...

  4. [LeetCode] 392. 判断子序列 ☆(动态规划)

    https://leetcode-cn.com/problems/is-subsequence/solution/java-dp-by-zxy0917-5/ 描述 给定字符串 s 和 t ,判断 s ...

  5. jenkins+docker+git+harbor构建及代码回滚(未完)

    目录 一.部署 环境工作流程介绍 部署harbor 一.部署 前提环境说明 192.168.111.3 该机器为git本地仓库,及git远程仓库(git用户创建),及Harbor镜像仓库 192.16 ...

  6. c# 虚属性

  7. vue 打印html

    1.https://github.com/xyl66/vuePlugs_printjs从这个路径下载print.js.放到你的代码中 2.我是放到我本地一个js文件中. 3.引入当前文件 //打印插件 ...

  8. 有关Error during sbt execution: No Scala version specified or detected的解决方案--SBT

    sbt 全称为 Simple Build Tool,是 Scala 项目中的标准构建工具,类似于 Java 下的 Maven/Groovy 中的 Gradle. 项目的构建 项目依赖自动化管理 提供统 ...

  9. ERROR: Cannot uninstall 'wrapt'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

    pip install imagededup 时,报错:Cannot uninstall 'wrapt'. It is a distutils installed project and thus w ...

  10. JVM系列二:垃圾回收

    什么时候回收对象 引用计数法 1.原理:为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1.引用计数为 0 的对象可被回收. 2.缺点:无法解决循环引用问题 可达性分析 ...