A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张玉建 中级黑马   /  2013-8-5 15:33  /  1168 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-8-6 21:31 编辑

对一段代码做了封装后,编译后出现了图一
import java.util.concurrent.atomic.AtomicInteger;
class  dome4
{
public static void main(String[] args)
{
  
  final business bus= new business();
  new Thread(
  new Runnable(){
   public void run()
   {
    //if(!fale)  内部类访问外部类变量需要声明最终类型。
    //在这里我们发现只要把要同步的代码翻转到一个类中就可以实现标记判断,进行通信,
    //代码进行改动
    for (int y= 0;y<50 ;y++ )
     business.sun(y);
    /*synchronized(dome4.class)
    {
     for (int x = 0;x<10 ;x++ )
     {
      System.out.println(Thread.currentThread().getName()+"..."+x+"sun zongcishu.."+y);
     }
    }*/
    //fale= true;
   }}
   
  ).start();
   
   for (int y= 0;y<50 ;y++ )
    business.main(y);
   /*synchronized(dome4.class)
   {
     for (int x = 0;x<10 ;x++ )
     {
      System.out.println(Thread.currentThread().getName()+"..."+x+"sun zongcishu.."+y);
     }
  
   }*/
   
}}   

class business
   {
    //在这里进行通信
    private    boolean fale=true;
    public    synchronized void sun(int y)
    {
     while(!fale)
      try
      {
       this.wait();
      }
      catch (InterruptedException e)
      {
       e.printStackTrace();
      }
     for (int x = 0;x<10 ;x++ )
     {
      System.out.println(Thread.currentThread().getName()+"..."+x+"sun zongcishu.."+y);
     }
     fale= false;
     this.notify();
    }
    public   synchronized void main(int y)
    {
     while(fale)
      try
      {
       wait();
      }
      catch (InterruptedException e)
      {
       e.printStackTrace();
      }
     for (int x = 0;x<10 ;x++ )
      {
      System.out.println(Thread.currentThread().getName()+"..."+x+"sun zongcishu.."+y);
      }
     fale= true;
     this.notify();
    }
   }
在分析下,主函数是一个静态的,他调用一个类的方法但不是静态的
我就把
private static    boolean fale= false;
    public static   synchronized void sun(int y)  
public  static synchronized void main(int y)
加了静态。又编译出现了图二

还在研究中,求解释??

1.jpg (120.33 KB, 下载次数: 1)

1图

1图

2静态.jpg (44.1 KB, 下载次数: 3)

图2

图2

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

5 个回复

倒序浏览
静态成员函数不可以调用非静态成员函数的!
回复 使用道具 举报
新建info.txt文件。 zhangsan30= lisi=40 wangwu=39 就会报“越界”异常。 要不你就把19行改成获取数组长度的打印语句。
回复 使用道具 举报
public class Demo4
{
        public static void main(String [] args)
        {
                final business bus=new business();
                new Thread(new Runnable()
                {
                        public void run()
                        {
                                for(int y=0;y<50;y++)
                                {
                                        bus.sun(y);
                                }
                        }
                }

                ).start();

                for(int y=0;y<50;y++)
                {
                        bus.main(y);
                }
        }
}

class business
{
        // 在这里进行通信
        private boolean fale=true;

        public synchronized void sun(int y)
        {
                while(!fale)
                        try
                        {
                                this.wait();
                        }
                        catch(InterruptedException e)
                        {
                                e.printStackTrace();
                        }
                for(int x=0;x<10;x++)
                {
                        System.out
                                        .println(Thread.currentThread().getName()+"..."+x+"sun zongcishu.."+y);
                }
                fale=false;
                this.notify();
        }

        public synchronized void main(int y)
        {
                while(fale)
                        try
                        {
                                wait();
                        }
                        catch(InterruptedException e)
                        {
                                e.printStackTrace();
                        }
                for(int x=0;x<10;x++)
                {
                        System.out
                                        .println(Thread.currentThread().getName()+"..."+x+"sun zongcishu.."+y);
                }
                fale=true;
                this.notify();
        }
}
其它类是的成员是不是静态的,和主函数没有太大关系,你只需要建立要用到的类的对象就OK,在主函数中建立的对象只所以是要用到final是因为内部类要访问局部变量时,局部变量必须被final 所修饰。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
建议把格式理好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马