Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1743565
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类:

2012-10-11 12:34:38

原文地址:多线程成共享数据方式 作者:yangrenjun


public class MultiThreadShareData {
 /**
  * 多线程成共享数据 面试题: 第一种:买票系统 方法:
  * 方式1:如果每个线程执行相同的代码,可以使用同一个Runable对象,这个Runable对象中有那个共享的数据
  */
 public static void main(String[] args) {
  
  ShareData1 data = new ShareData1();
  new Thread(data).start();
  new Thread(data).start();
   

   }
}
 class ShareData1 implements Runnable{
 
 private int count =100;
 
 @Override
 public void run() {
  
  while(true){
   count --;
  }
   
 }  
}
 ××××××××××××××××××××××××××××××××××××××××××××
 


public class MultiThreadShareData2 {
 /**
  * 多线程成共享数据(共享数据是指同一个对象)
  * 面试题:
  * 第二种方式:如果比如多个个线程执行代码不同比如以下示例一会加,一会减;测需要2个Runable 对象来操作;
                  设计4个线程,其中2个线程每次对j增加1,另外两个线程对J 每次减少1.写出程序;
  */
 
 public static void main(String[] args) {
 
 //共同对象 
    final ShareData data = new ShareData();
  
 /* 加 j */ 
     new Thread(new Runnable(){//内部类
      @Override
     public void run() {
       data.sub();
      
     }
     }).start();
   
  /* 减 j  */ 
     new Thread(new Runnable(){
      @Override
     public void run() {
       data.add();
      
     }
     }).start();
   }
 
}
class ShareData {
 
 private int j=0;
 
 public synchronized void add(){
  j++;
 }
 
 public synchronized void sub(){
  j--;
 }
 
 
demo3: 网上搜索的答案
 
/**
 * 第二种方式:如果比如多个个线程执行代码不同比如以下示例一会加,一会减;测需要 2个Runable 对象来操作;
    设计4个线程,其中2个线程每次对j增加1,另外两个线程对J 每次减少1.写出程序;
 * @author Administrator
 * 这里2个Runnable都是内部类,可以访问外部类的成员变量 这里是 j ,通过内部类调用外部类方法 J++ ,J --
 */

public class ThreadTest1 {
 private int j;
 public static void main(String args[]) {
  ThreadTest1 tt = new ThreadTest1();
        //必须通过外部类的对象才能实例化内部类
  Inc inc = tt.new Inc();
  Dec dec = tt.new Dec();
  for (int i = 0; i < 2; i++) {
   Thread t = new Thread(inc);
   t.start();
   t = new Thread(dec);
   t.start();
  }
 }
 private synchronized void inc() {
  j++;
  System.out.println(Thread.currentThread().getName() + "-inc:" + j);
 }
 private synchronized void dec() {
  j--;
  System.out.println(Thread.currentThread().getName() + "-dec:" + j);
 }
 //内部类 增
 class Inc implements Runnable {
  // 可以操作外部类的变量 j
  public void run() {
   for (int i = 0; i < 2; i++) {
    inc();
   }
  }
 }
 //内部类 减
 class Dec implements Runnable {
        // 可以操作外部类的变量 j
  public void run() {
   for (int i = 0; i < 2; i++) {
    dec();
   }
  }
 }
}
 
 
 
 
 
 
 
 
阅读(131) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~