Java多线程资源共享
2021/7/15 17:09:08
本文主要是介绍Java多线程资源共享,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Java多线程资源共享
我们在编写Java多线程并发控制程序时,经常需要我们考虑到多个线程之间资源共享问题。那么,什么是资源共享问题?在Java多线程中资源共享就是多个线程共用同一个变量或者对象。下面通过模拟学生进教室线程阐述两种资源共享的方法。
1. 继承Thread类
每new一个Thread类或者子类对象时,非静态属性(实例属性)都会在内存中重新加载,起不到共用资源的效果,因此我们需要将共用的对象或者变量用static修饰,使其成为类属性,在内存中只加载一次。具体代码和结果如下:
Classroom类:
public class Classroom extends Thread { private static int studentNumber = 55;//学生人数 private static int frontCount = 0;//前门人数 private static int backCount = 0;//后门人数 private static Object object = new Object(); @Override public void run() { do { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (object) { if (studentNumber > 0) { if (Thread.currentThread().getName().equals("前门")) { frontCount++; } else backCount++; System.out.println(Thread.currentThread().getName() + "有人进教室!"); studentNumber--; } else { if (Thread.currentThread().getName().equals("前门")) System.out.println(Thread.currentThread().getName() + "共进了" + frontCount + "学生"); else System.out.println(Thread.currentThread().getName() + "共进了" + backCount + "学生"); break; } } } while (true); } }
Test类:
public class TestDemo2_1 { public static void main(String[] args) { Classroom front=new Classroom(); Classroom back=new Classroom(); front.setName("前门"); back.setName("后门"); front.start(); back.start(); } }
测试结果如下:
后门有人进教室! 前门有人进教室! 后门有人进教室! 前门有人进教室! ...... 前门共进了27学生 后门共进了28学生
2. 通过实现Runnable接口
在Java中只能实现单继承,因此不能继承其他类,不适合资源共享,可以通过实现Runnable接口,通过同一个Runnable接口实现类对象创建多个线程,则多个线程共享Runnable对象。具体代码和结果如下:
IntoDoor类:
public class IntoDoor implements Runnable { private int studentNumber = 55;//学生人数 private int frontCount = 0;//前门人数 private int backCount = 0;//后门人数 @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (this) { if (studentNumber > 0) { if (Thread.currentThread().getName().equals("前门")) { frontCount++; } else backCount++; System.out.println(Thread.currentThread().getName() + "有人进教室!"); studentNumber--; } else { if (Thread.currentThread().getName().equals("前门")) System.out.println(Thread.currentThread().getName() + "共进了" + frontCount + "学生"); else System.out.println(Thread.currentThread().getName() + "共进了" + backCount + "学生"); break; } } } } }
Test类:
public class TestDemo2 { public static void main(String[] args) { IntoDoor Door =new IntoDoor(); Thread front=new Thread(Door,"前门"); Thread back=new Thread(Door,"后门"); front.start(); back.start(); } }
测试结果:
后门有人进教室! 前门有人进教室! 后门有人进教室! 前门有人进教室! ...... 前门共进了27学生 后门共进了28学生
这篇关于Java多线程资源共享的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-06责任分配矩阵在项目管理中的作用:结合工具提升团队生产力
- 2025-01-06板栗看板:优化项目管理的实用策略,助你轻松完成任务
- 2025-01-06电商小白怎么选取合适的工具?一站式工具指南来啦
- 2025-01-06企业如何避免春节期间的项目断层?四大方法教给你!
- 2025-01-06初创团队如何在动态环境下利用看板工具快速迭代
- 2025-01-06企业内部管理如何实现高效?四大策略教会你
- 2025-01-06给 Postgres 写一个向量插件 - 向量类型
- 2025-01-06电商蛇年营销新篇章:看板软件打造高效、精准营销体系
- 2025-01-06初创团队如何利用看板工具高效推进产品开发
- 2025-01-06IT项目经理的日常工作是什么?职责与所需技能大解析