zoukankan      html  css  js  c++  java
  • Thread的第五天学习

    1、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个
    共享数据,例如:卖票系统就可以这么做!

    package com.thread.demo;
    
    public class SellTicktThreadShareData {
        
        public static void main(String[] args) {
            Ticket ticket = new Ticket();
            new Thread(ticket).start();
            new Thread(ticket).start();
        }
    }
    
    class Ticket implements Runnable{
        private int count = 1000;
        
        public void run()
        {
            while(true)
            {
                if(count <= 0)
                {
                    break;
                }
                else
                {
                    count--;
                    System.out.println(Thread.currentThread().getName()+"卖的票还剩:"+count);
                }
            }
        }
    }

    2、如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,下面2种方式实现Runnable对象间的数据共享:
    1)将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象。每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样容易实现针对该数据进行各个操作的互斥和通信。

    package com.thread.demo;
    
    public class MutiThreadShareData {
        
        public static void main(String[] args) {
            ShareData data = new ShareData();
            new Thread(new ShareThreadOne(data)).start();
            new Thread(new ShareThreadTwo(data)).start();
        }
    
    }
    
    class ShareThreadOne implements Runnable{
        private ShareData data ;
        
        public ShareThreadOne(ShareData data){
            this.data = data;
        }
        
        public void run()
        {
            data.decement();
        }
    }
    
    class ShareThreadTwo implements Runnable{
        private ShareData data ;
        public ShareThreadTwo(ShareData data){
            this.data = data;
        }
        
        public void run()
        {
            data.incement();
        }
    }
    
    
    class ShareData {
        int j = 0;
        
        public synchronized void incement()
        {
            j++;
            System.out.println(j);
            
        }
        
        public synchronized void decement()
        {
            j--;
            System.out.println(j);
            
        }
    
    }

    2)将这些Runnable对象作为某一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线程对共享数据的操作方法也分配给外部类,以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法。

    package com.thread.demo;
    
    public class MutiThreadShareData2 {
        
        private static ShareData2 data = new ShareData2();
        
        public static void main(String[] args) {
            
            new Thread(new Runnable(){
                
                public void run()
                {
                    data.decement();
                }
                
            }).start();
            new Thread(new Runnable(){
                
                public void run()
                {
                    data.incement();
                }
                
            }).start();
        }
    
    }
    
    class ShareData2 {
        int j = 0;
        
        public synchronized void incement()
        {
            j++;
            System.out.println(j);
            
        }
        
        public synchronized void decement()
        {
            j--;
            System.out.println(j);
            
        }
    
    }

    另一中共享数据模式:
      将共享数据封装在另外一个对象中,每个线程对共享数据的操作方法也分配到那个对象身上去完成,对象作为这个外部类中的成员变量或方法中的局部变量,每个线程的Runnable对象作为外部类中的成员内部类或局部内部类。

    package com.thread.demo;
    
    public class ShareDataObject {
        private static int i = 0;
        
        public static void main(String[] args) {
            ShareDataObject shareData = new ShareDataObject();
            for(int i= 0;i<10;i++)
            {
                new Thread(shareData.new ShareDataThread1(),i+"  1 ").start();
                new Thread(shareData.new ShareDataThread2(),i+"  2 ").start();
            }
            
        }
        
        class ShareDataThread1 implements Runnable{
    
            @Override
            public synchronized void run() {
                
                i++;
                System.out.println(Thread.currentThread().getName()+"--"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
            
        }
        
        class ShareDataThread2 implements Runnable{
    
            @Override
            public synchronized void run() {
                i--;
                System.out.println(Thread.currentThread().getName()+"--"+i);
            }
            
        }
    
    }
  • 相关阅读:
    ArcGIS10新功能体验
    GP(Geoprocessing)服务的发布与调用
    ArcGIS10新体验之地图编辑
    ArcGIS10新功能之制作地图集
    推荐几本GIS专业书籍
    ArcGIS时态数据应用——动态展示台风中心轨迹
    为gridview“删除”列添加确认对话框
    (转)面向对象设计思想(C#)
    数据库Oracle与SqlServer与Access
    Oracle日期时间加减法运算
  • 原文地址:https://www.cnblogs.com/yanff/p/4675703.html
Copyright © 2011-2022 走看看