java多线程下如何调用一个共同的内存单元(调用同一个对象)

 1 /*
 2  * 关于线程下共享相同的内存单元(包括代码与数据)
 3  * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作。
 4  * 对于Thread(Runnable target)构造方法创建的线程,轮到它来享用CPU资源时。
 5  * 目标对象就会自动调用接口中的run()方法
 6  * */
 7
 8 /* ----------------举例子-------------------  */
 9
10 /*
11  *  使用Thread类创建两个模拟猫和狗的线程,猫和狗共享房屋中的一桶水,即房屋是线程的目标对象
12  * ,房屋中的一桶水被猫和狗共享。猫和狗轮流喝水(狗大喝水多,猫小喝水少),当谁被喝尽时,猫和狗进入
13  * 死亡状态,猫和狗进入死亡状态。猫和狗在轮流喝水的过程中,主动休息片刻(让THread类调用Sleep(int n))
14  * 进入中断状态),而不是等到被强制中断喝水。
15  **/
16 package DEMO;
17
18 public class EXample12_3 {
19
20     public static void main( String args [] )
21     {
22         House house = new House();
23         house.setWater(10);
24         Thread dog,cat ;
25         dog = new Thread(house);  //dog和cat的目标对象相同
26         cat = new Thread(house);
27         dog.setName("狗");
28         dog.setName("猫");
29         dog.start();
30         cat.start();
31     }
32 }
33
34 class House implements Runnable
35 {
36     int WaterAmount ;
37
38     public void setWater(int w)
39     {
40        WaterAmount = w;
41     }
42     public void run() {
43       // TODO Auto-generated method stub
44        while(true)
45       {
46           String name =Thread.currentThread().getName();
47          if(name.equals("狗"))
48          {
49               System.out.println(name+"喝水");
50              WaterAmount =WaterAmount-2;
51          }
52       else
53           if(name.equals("猫"))
54          {
55             System.out.println(name+"喝水");
56             WaterAmount=WaterAmount-1;
57          }
58
59       System.out.println(" 剩 "+WaterAmount);
60       try {
61         Thread.sleep(2000);       //间隔时间
62     } catch (InterruptedException e) {
63         // TODO Auto-generated catch block
64         e.printStackTrace();
65     }
66       if(WaterAmount<=0)  return ;
67     }
68 }
69 }

/*
需要注意的是: 一个线程的run方法的执行过程中可能随时被强制中断(特别是对于双核系统的计算机)
*/

java多线程下如何调用一个共同的内存单元(调用同一个对象),布布扣,bubuko.com

时间: 2024-12-26 08:26:22

java多线程下如何调用一个共同的内存单元(调用同一个对象)的相关文章

java多线程下的所的概念

锁和synchronized关键字     为了同步多线程,Java语言使用监视器(monitors),一种高级的机制来限定某一 时刻只有一个线程执行一段受监视器保护的代码.监视器的行为是通过锁来实现的,每一个对象都有一个锁.    每个线程都有一个工作内存,在里面存放从所有线程共享的主内存里拷贝来的变量.为了访问一个共享的变量,一个线程通常先要获得一个锁并刷新它的工作内存,这将共享的值从主内存被拷贝到工作内存.当线程解锁时将会把工作内存里的值写回主内存.&n bsp;   一个线程能多次获得对

Java多线程导致的的一个事物性问题

业务场景 我们现在有一个类似于文件上传的功能,各个子站点接受业务,业务上传文件,各个子站点的文件需要提交到总站点保存,文件是按批次提交到总站点的,也就是说,一个批次下面约有几百个文件. 考虑到白天提交这么多文件会影响到子站点其他系统带宽,我们将分站点的文件提交到总站点这个操作过程独立出来,放到晚上来做,具体时间是晚上7:00到早上7:00. 这个操作过程我们暂且称作"排程". 排程在运行之后,先获取所有需要上传到总站点的批次信息,拿到批次信息之后,将这个批次表的状态置为正在同步数据,这

java多线程编程--如何开始一个线程

如何开始一个线程 1. java多线程的实现方式 1.1 继承Thread类 定义类如下: public SubThread extends Thread { @override public void run() { ... } } 使用时: Thread subThread = new SubThread(); subThread.start(); 可以使用Thread类已有的函数进行操作. 1.2 实现Runnable接口 定义类如下: public SubThread implement

[Java] 多线程下生产者消费者问题的五种同步方法实现

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题. 生产者消费者模式的优点 - 解耦 - 支持并发 - 支持忙闲不均 解决方法可分为两类: (1)用信号量和锁机制实现生产者和消费者之间的同步: - wait() / notify()方法 - await() / signal()方法 - BlockingQueue阻塞队列方法 - Semaphore方法 (2)在生产者和消费者之间建立一个管道.(一般不使用,缓冲区不易控制.数据不易封装和传输) - PipedInputStream

java多线程很好的一个实例

java中的多线程 在java中要想实现多线程有两种手段一种是继续Thread类另外一种是实现Runable接口. 对于直接继承Thread的类来说代码大致框架是 ? 1 2 3 4 5 6 7 8 9 10 11 12 class 类名extends Thread{ 方法1; 方法2 … public void run(){ // other code… } 属性1 属性2 … } 先看一个简单的例子 ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1

java多线程编程--如何终止一个线程

1. Thread.stop()函数 stop()函数终止线程就像是强行拔掉电源线关机一样,可能会带来未知风险,因此目前不再推荐使用这种方式.请忘记它吧~~ 2. 改变标志变量状态 通常我们会在线程中使用一个标志变量来控制线程的运行,如: public class TestCallable implements Runnable { private boolean running = true; public void stop() { this.running = false; } publi

Java多线程产生死锁的一个简单案例

synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象:2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象:3. 修改一个静态方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象:4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对

JAVA多线程下,获取递增的序列号

场景描述: 1,目前我们的系统可以简单归纳成MVC的架构模式 2,每个前端的请求过来,都会在C层开启事务,最后处理结束后,也在在C层关闭事务(实际是在C层的底层统一做了事务的开启和提交):        问题描述:        有一个接口方法,用于获取数据库中的序列号,然后+1再保存到数据库. 客户的报障是:并发情况下出现了单号重复,也就是多个线程同时取到了相同的序列号,而不是等到上一个线程将序列号+1后的值. 问题分析:        初步分析,存在两个问题: 1,方法的锁不起作用 2,序列

java多线程下模拟抢票

我们设置三个对象分别同时抢20张票,利用多线程实现. 1 public class Web123506 implements Runnable{ 2 private int ticteksNums=20;//票数 3 4 @Override 5 public void run() { 6 while (true){ 7 if(ticteksNums<0){ 8 break; 9 } 10 /* try { 11 //睡眠 12 Thread.sleep(200); 13 } catch (Int