疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

多线程成共享数据方式


 

   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();
   
    }
   
    }
   
    }
   
    }