多个线程共享变量的例子,线程为什么要Thread.sleep
来源:互联网 发布:淘宝主图怎么做 编辑:程序博客网 时间:2024/05/22 01:40
线程中变量有共享变量和非共享变量的区别,很重要的概念,这里只讲共享变量。多个线程共享20张票的例子。
MyThread类:
package test;public class MyThread extends Thread {private int ticket = 20;@Overridepublic void run() {while (true) {try {Thread.sleep(100);synchronized (getClass()) {if (ticket > 0) {System.out.println("线程" + Thread.currentThread().getName() + "卖出1张票," + "余票" + (--ticket) + "张!");}}} catch (Exception e) {e.printStackTrace();}}}}
测试类:
package httpClient;public class Test {public static void main(String[] args) {MyThread myThread = new MyThread();Thread thread1 = new Thread(myThread,"A");Thread thread2 = new Thread(myThread,"B");Thread thread3 = new Thread(myThread,"C");thread1.start();thread2.start();thread3.start();}}
测试结果:
线程B卖出1张票,余票19张!
线程A卖出1张票,余票18张!
线程C卖出1张票,余票17张!
线程B卖出1张票,余票16张!
线程A卖出1张票,余票15张!
线程C卖出1张票,余票14张!
线程B卖出1张票,余票13张!
线程C卖出1张票,余票12张!
线程A卖出1张票,余票11张!
线程B卖出1张票,余票10张!
线程C卖出1张票,余票9张!
线程A卖出1张票,余票8张!
线程B卖出1张票,余票7张!
线程A卖出1张票,余票6张!
线程C卖出1张票,余票5张!
线程B卖出1张票,余票4张!
线程C卖出1张票,余票3张!
线程A卖出1张票,余票2张!
线程B卖出1张票,余票1张!
线程A卖出1张票,余票0张!
注意的问题:
为什么需要休眠?
答:之所以每次Thread.sleep(100),是为了让其它线程有执行的机会,否则会只有一个线程在执行,现将程序代码改为不休眠:
package test;public class MyThread extends Thread {private int ticket = 20;@Overridepublic void run() {while (true) {try {//Thread.sleep(100);synchronized (getClass()) {if (ticket > 0) {System.out.println("线程" + Thread.currentThread().getName() + "卖出1张票," + "余票" + (--ticket) + "张!");}}} catch (Exception e) {e.printStackTrace();}}}}运行测试类结果:
线程A卖出1张票,余票19张!
线程A卖出1张票,余票18张!
线程A卖出1张票,余票17张!
线程A卖出1张票,余票16张!
线程A卖出1张票,余票15张!
线程A卖出1张票,余票14张!
线程A卖出1张票,余票13张!
线程A卖出1张票,余票12张!
线程A卖出1张票,余票11张!
线程A卖出1张票,余票10张!
线程A卖出1张票,余票9张!
线程A卖出1张票,余票8张!
线程A卖出1张票,余票7张!
线程A卖出1张票,余票6张!
线程A卖出1张票,余票5张!
线程A卖出1张票,余票4张!
线程A卖出1张票,余票3张!
线程A卖出1张票,余票2张!
线程A卖出1张票,余票1张!
线程A卖出1张票,余票0张!
结果显示,一直只有线程A在执行。
- 多个线程共享变量的例子,线程为什么要Thread.sleep
- 多个线程共享DLL中的变量
- 多个线程访问共享变量
- 线程(Thread)Sleep
- Thread学习(八) ThreadLocal实现线程范围内的共享变量
- 线程Thread Sleep(0)的意义重大
- java线程 Thread.sleep()的学习了解
- Java中的线程的休眠Thread.sleep()
- No4.线程中断+Thread.sleep()的用法
- 线程的优先级、Thread.yield()、Thread.sleep(5000)
- Thread学习(三)多个线程访问共享对象和数据的方式
- 为什么要线程同步的例子
- java 线程Thread.Sleep详解
- java 线程Thread.Sleep详解
- java 线程Thread.Sleep详解
- java 线程Thread.Sleep详解
- java 线程Thread.Sleep详解
- java 线程Thread.Sleep详解
- Mybaties中的总结<一>
- PostgreSQL LIKE 查询效率提升实验
- Maven详解之聚合与继承
- 软件工程复习资料(四)
- MFC实现连连看二:地图的显示
- 多个线程共享变量的例子,线程为什么要Thread.sleep
- 数学方面的一些书籍
- sql查询单个项目的全年总和,按月份统计怎么实现?
- Leetcode-Remove Element
- Javascript插件--模态框(Bootstrap)
- JVM(2):JVM内存结构
- Maven最佳实践:遵循约定
- (二)Quartz 2.2 动态添加、修改和删除定时任务
- scrapy 一次性提取多层嵌套标签的所有文本