2024年10月匿名内部类实现线程(创建一个匿名内部类)

 更新时间:2024-10-12

  ⑴匿名内部类实现线程(创建一个匿名内部类

  ⑵很简单的例子:publilassNoneClass{Peoplesman=newPeoples(){publicvoideat(){System.out.println(“吃饭“);}};}interfacePeoples{publicvoideat();}这里的newPeoples(){publicvoideat(){System.out.println(“吃饭“);}};就创建了个匿名内部类本来接口interface是不能new的,但是紧跟newPeoples({}后跟的大括号,表示这个接口有个实现类,其实new的是Peoples这个接口的实现类,但是这个实现类是匿名内部类的形式。

  ⑶分类:电脑/网络》》程序设计》》其他编程语言问题描述:如题,能详细的解释一下吗?如果很长,能给一个有详细解释的地址吗?解析:匿名内部类可以减少你命名一个类的烦脑(^^)其有很多优点比如可以访问外部类的私有方法newYourClass{...}这个例子是一个多线程的小程序,这里面就应用到了匿名内部类,实现了Runnable接口。匿名内部类的一般好处是:是代码更加简洁,紧凑,但带来的是易读性下降。他一般用在GUI编程中实现事件处理等等。希望大家一起讨论publilassRunnableTest{publicstaticvoidmain(Stringargs){MyThreadmt=newMyThread();MyThreadmt=newMyThread();MyThreadmt=newMyThread();mt.th.start();mt.th.start();mt.th.start();}}classMyThreadimplementsRunnable{Threadth=newThread(this);publicvoidrun(){for(inti=;i《;i++){System.out.println(“BMW“+i);}}}classMyThread{Threadth=newThread(){publicvoidrun(){for(inti=;i《;i++){System.out.println(i);}}};}classMyThread{Runnablera=newRunnable(){publicvoidrun(){for(charch=;ch《;ch++){System.out.println(ch);}}};Threadth=newThread(ra);}匿名内部类可以访问外部类的私有成员,其他的方式实现接口和继承类做不到实现方式:SuperTypeaa=newSuperType(constructionparameters){methodsanddata}或InterfaceTypeaa=newInterfaceType(){methodsanddata}具体实现时需要把SuperType和InterfaceType换成具体的超类和接口。匿名内部类可以访问外部类的私有成员,其他的方式实现接口和继承类做不到内部类应该都可以的。我觉得匿名的应该是隐藏实现,而且用完就out的那种。

  ⑷java匿名内部类具体概念是什么,在什么地方用到

  ⑸java匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类,没有类名,根据多态,我们使用其父类名。因他是局部内部类,那么局部内部类的所有限制都对其生效。匿名内部类是唯一一种无构造方法类。大部分匿名内部类是用于接口回调用的。匿名内部类在编译的时候由系统自动起名Out$.class。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。因匿名内部类无构造方法,所以其使用范围非常的有限。当需要多个对象时使用局部内部类,因此局部内部类的应用相对比较多。匿名内部类中不能定义构造方法。如果一个对象编译时的类型是接口,那么其运行的类型为实现这个接口的类。

  ⑹public?class?Outer?{private?static?int?i?=?;private?int?j?=?;public?static?void?outer_f(){}public?void?outer_f(){}//?静态内部类可以用public,protected,private修饰//?静态内部类中可以定义静态或者非静态的成员static?class?Inner{static?int?inner_i?=?;int?inner_j?=?;static?void?inner_f(){System.out.println(“Outer.i“+i);//静态内部类只能访问外部类的静态成员outer_f();//包括静态变量和静态方法}void?inner_f(){//?System.out.println(“Outer.i“+j);//静态内部类不能访问外部类的非静态成员//?outer_f();//包括非静态变量和非静态方法}}public?void?outer_f(){//?外部类访问内部类的静态成员:内部类.静态成员System.out.println(Inner.inner_i);Inner.inner_f();//?外部类访问内部类的非静态成员:实例化内部类即可Inner?inner?=?new?Inner();inner.inner_f();}public?static?void?main(String?args)?{new?Outer().outer_f();}}

  ⑺Java多线程实现异步调用

  ⑻在JAVA平台实现异步调用的角色有如下三个角色:调用者提货单真实数据一个调用者在调用耗时操作不能立即返回数据时先返回一个提货单然后在过一断时间后凭提货单来获取真正的数据去蛋糕店买蛋糕不需要等蛋糕做出来(假设现做要很长时间只需要领个提货单就可以了(去干别的事情等到蛋糕做好了再拿提货单取蛋糕就可以了publilassMain{publicstaticvoidmain(Stringargs){

  ⑼Systemoutprintln(mainBEGIN);

  ⑽Hosthost=newHost();

  ⑾Datadata=hostrequest(A);

  ⑿Datadata=hostrequest(B);

  ⒀Datadata=hostrequest(C);

  ⒁Systemoutprintln(mainotherJobBEGIN);

  ⒂Threadsleep();

  ⒃}catch(InterruptedExceptione){

  ⒄Systemoutprintln(mainotherJobEND);

  ⒅Systemoutprintln(data=+datagetContent());

  ⒆Systemoutprintln(data=+datagetContent());

  ⒇Systemoutprintln(data=+datagetContent());

  ⒈Systemoutprintln(mainEND);

  ⒉这里的main类就相当于顾客host就相当于蛋糕店顾客向蛋糕店定蛋糕就相当于发请求request返回的数据data是FutureData的实例就相当于提货单而不是真正的蛋糕在过一段时间后(sleep一段时间后调用datagetContent()也就是拿提货单获取执行结果

  ⒊下面来看一下顾客定蛋糕后蛋糕店做了什么

  ⒋publilassHost{

  ⒌publicDatarequest(finalintcountfinalcharc){

  ⒍Systemoutprintln(request(+count++c+)BEGIN);

  ⒎//()建立FutureData的实体

  ⒏finalFutureDatafuture=newFutureData();

  ⒐//()为了建立RealData的实体启动新的线程

  ⒑newThread(){

  ⒒publicvoidrun(){

  ⒓//在匿名内部类中使用countfuturec

  ⒔RealDatarealdata=newRealData(countc);

  ⒕futuresetRealData(realdata);

  ⒖Systemoutprintln(request(+count++c+)END);

  ⒗//()取回FutureData实体作为传回值

  ⒘returnfuture;

  ⒙host(蛋糕店)在接到请求后先生成了提货单FutureData的实例future然后命令蛋糕师傅RealData去做蛋糕realdata相当于起个线程去做蛋糕了然后host返回给顾客的仅仅是提货单future而不是蛋糕当蛋糕做好后蛋糕师傅才能给对应的提货单蛋糕也就是futuresetRealData(realdata)

  ⒚下面来看看蛋糕师傅是怎么做蛋糕的

  ⒛建立一个字符串包含count个c字符为了表现出犯法需要花费一些时间使用了sleep

  publilassRealDataimplementsData{privatefinalStringcontent;

  publicRealData(intcountcharc){

  Systemoutprintln(makingRealData(+count++c+)BEGIN);

  for(inti=;i《count;i++){

  Threadsleep();

  }catch(InterruptedExceptione){

  Systemoutprintln(makingRealData(+count++c+)END);

  ntent=newString(buffer);

  publicStringgetContent(){

  returncontent;

  现在来看看提货单future是怎么与蛋糕content对应的:

  publilassFutureDataimplementsData{privateRealDatarealdata=null;

  privatebooleanready=false;

  publicsynchronizedvoidsetRealData(RealDatarealdata){

  if(ready){

  return;//防止setRealData被调用两次以上

  thisrealdata=realdata;

  thisready=true;

  notifyAll();

  publicsynchronizedStringgetContent(){

  while(!ready){

  }catch(InterruptedExceptione){

  returnrealdatagetContent();

  顾客做完自己的事情后会拿着自己的提货单来取蛋糕

  Systemoutprintln(data=+datagetContent());

  这时候如果蛋糕没做好就只好等了

  while(!ready){try{

  }catch(InterruptedExceptione){

  //等做好后才能取到

  returnrealdatagetContent();

  对于每个请求host都会生成一个线程这个线程负责生成顾客需要的蛋糕在等待一段时间以后如果蛋糕还没有做好顾客还必须等待直到蛋糕被做好也就是

  futuresetRealData(realdata);执行以后顾客才能拿走蛋糕

  每个线程只是专门负责制作特定顾客所需要的蛋糕也就是顾客A对应着蛋糕师傅A顾客B对应着蛋糕师傅B即使顾客B的蛋糕被先做好了顾客A也只能等待蛋糕师傅A把蛋糕做好换句话说顾客之间没有竞争关系lishixinzhi/Article/program/Java/gj//

  Vivox多线程设置怎么开

  开启Vivox多线程设置要开启一个多线程有两种方法:、继承Thread类通过继承Thread类的方式实现多线程有个步骤:《》create一个类,让它继承Thread类《》重写Thread类里面的run方法,把需要执行的代码块放在run方法体内《》在主线程(主程序内创建该类的对象《》用该对象调用start方法例子:packagemultiThread;publilassjichengThread{publicstaticvoidmain(Stringargs){myThreadmt=newmyThread();mt.start();for(inti=;i《;i++)System.out.println(“主线程程序在执行.......“);}}classmyThreadextendsThread{publicvoidrun(){for(inti=;i《;i++)System.out.println(“子线程程序在执行.......“);}}执行结果:可以看到两个线程在同时执行但是有时候即使开启了一个多线程(开启多线程就是CPU在执行主程序的时候,同时分配一些空间执行子程序,但是还是看不到两个线程在同时执行,那有可能是主线程的程序执行时间太短,没有看到交替执行的结果,比如在for循环里面把循环的次数减小到,就看不到交替执行的结果,但其实还是多线程除了创建两个类之外,还可以用匿名内部类的方式继承Thread类,重写Thread里面的run方法,调用start()方法,实现多线程,如下:(匿名内部类就是创建一个类的对象,并不给其赋给对应的引用,如下面的newThread()创建了一个Thread的对象,米有给其赋给一个引用,而newThread后面跟小括号、大括号,表示该类继承Thread类,并创建了一个Thread类的子类对象,里面的run方法表示重写该方法,最终相当于创建了一个Thread类的对象,再调用start方法执行线程packagemultiThread;publilassnimingneibuleishixian{publicstaticvoidmain(Stringargs){newThread(){Overridepublicvoidrun(){for(inti=;i《;i++)System.out.println(“子线程在执行....“);}}.start();for(inti=;i《;i++){System.out.println(“主线程在执行....“);}}}运行结果:、实现Runable接口通过该方法实现多线程的步骤如下:《》创建一个类,实现Runnable接口《》重写run方法(注意:run方法是Runnable接口里面唯一的方法,Thread类也是实现了Runnable接口《》创建该类的一个对象《》调用Thread类的有参构造,把上一步创建的对象作为参数传递,创建Thread类的一个对象《》调用该对象的start方法

  Java匿名内部类可以实现接口吗

  匿名内部类可以用于接口上,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现。最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。具体示例代码如下:interfacePerson{publicvoideat();}publilassDemo{publicstaticvoidmain(Stringargs){Personp=newPerson(){publicvoideat(){System.out.println(“eatsomething“);}};p.eat();}}运行结果:eatsomething

  Android技术分享|Android中部分内存泄漏示例及解决方案

  请注意以下的例子是虚构的

  源自Android文档中的Memorychurn一词,中文翻译为内存抖动。

  指快速频繁的创建对象从而产生的性能问题。

  引用Android文档原文:

  Java内存泄漏的根本原因是长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏。

  尽管短生命周期对象已经不再需要,但因为长生命周期依旧持有它的引用,故不能被回收而导致内存泄漏。

  静态集合类引起的内存泄漏

  如果仅仅释放引用本身(tO=null),ArrayList依然在引用该对象,GC无法回收。

  在Java应用中,通常会用到很多监听器,一般通过addXXXXListener()实现。但释放对象时通常会忘记删除监听器,从而增加内存泄漏的风险。

  如数据库连接、网络连接(Socket和I/O连接。忘记显式调用close()方法引起的内存泄漏。

  内部类和外部模块的引用

  内部类的引用是很容易被遗忘的一种,一旦没有释放可能会导致一系列后续对象无法释放。此外还要小心外部模块不经意的引用,内部类是否提供相应的操作去除外部引用。

  由于单例的静态特性,使其生命周期与应用的生命周期一样长,一旦使用不恰当极易造成内存泄漏。如果单利持有外部引用,需要注意提供释放方式,否则当外部对象无法被正常回收时,会进而导致内存泄漏。

  如集合的使用范围超过逻辑代码的范围,需要格外注意删除机制是否完善可靠。比如由静态属性static指向的集合。

  以下为简单逻辑代码,只为举例说明内存泄漏问题,不保证单利模式的可靠性。

  AppManager创建时需要传入一个Context,这个Context的生命周期长短至关重要。

  如果传入的是Application的Context,因为Application的生命周期等同于应用的生命周期,所以没有任何问题。

  如果传入的是Activity的Context,则需要考虑这个Activity是否在整个生命周期都不会被回收了,如果不是,则会造成内存泄漏。

  非静态内部类创建静态实例造成的内存泄漏

  应该将该内部类单独封装为一个单例来使用。

  匿名内部类/异步线程

  Runnable都使用了匿名内部类,将持有MyActivity的引用。如果任务在Activity销毁前未完成,将导致Activity的内存无法被回收,从而造成内存泄漏。

  解决方法:将Runnable独立出来或使用静态内部类,可以避免因持有外部对象导致的内存泄漏。

  Handler造成的内存泄漏

  Handler属于TLS(ThreadLocalStorage)变量,生命周期与Activity是不一致的,容易导致持有的对象无法正确被释放

  当Android应用程序启动时,该应用程序的主线程会自动创建一个Looper对象和与之关联的MessageQueue。

  当主线程中实例化一个Handler对象后,它就会自动与主线程Looper的MessageQueue关联起来。所有发送到MessageQueue的Messag都会持有Handler的引用,所以Looper会据此回调Handle的handleMessage()方法来处理消息。只要MessageQueue中有未处理的Message,Looper就会不断的从中取出并交给Handler处理。

  另外,主线程的Looper对象会伴随该应用程序的整个生命周期。

  在Java中,非静态内部类和匿名类内部类都会潜在持有它们所属的外部类的引用,但是静态内部类却不会。

  当该Activity被finish()掉时,延迟执行任务的Message还会继续存在于主线程中,它持有该Activity的Handler引用,所以此时finish()掉的Activity就不会被回收了从而造成内存泄漏(因Handler为非静态内部类,它会持有外部类的引用,在这里就是指SampleActivity。

  避免不必要的静态成员变量

  对于BroadcastReceiver、ContentObserver、File、Cursor、Stream、Bitmap等资源的使用,应在Activity销毁前及时关闭或注销。

  不使用WebView对象时,应调用`destroy()`方法销毁。

  java中的匿名类是怎么回事

  匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要采用另一种形式的new语句,如下所示:new《类或接口》《类的主体》这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体实在不理解从网上搜索下吧,很多相关介绍和实例,。匿名类,匿名内部类。

  java中线程的一个问题

  这就是我们常说的多态。我简单的说一下线程的执行原理(只说楼主关心的这一点,要全说完,我没这样的能力。其实Thread类用了一个代理,原理如下:publilassThreadimplementsRunnable{privateRunnablerunnable;publicThread(){}publicThread(Runnablerun){this.runnable=run;}publicvoidrun(){runnable.run();}}/*当你重写了Thread的run()方法,原来的当然失效了;注意呀,行这里new的不是Thread这个类的实例,而是一个继承了Thread的匿名内部类,并且这个类重写了run()方法;*/

  Java匿名内部类怎样创建有何作用和优点创建线程怎样使用匿名内部类

  匿名内部类就是没有名字的内部类。这是Java为了方便我们编写程序而设计的一个机制。因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适,而且也免去了给它取名字的烦恼。xdxaxdxa、如果满足下面的一些条件,使用匿名内部类是比较合适的:xdxa·只用到类的一个实例。xdxa·类在定义后马上用到。xdxa·类非常小(SUN推荐是在行代码以下xdxa·给类命名并不会导致你的代码更容易被理解。xdxa在使用匿名内部类时,要记住以下几个原则:xdxa·匿名内部类不能有构造方法。xdxa·匿名内部类不能定义任何静态成员、方法和类。xdxa·匿名内部类不能是public,protected,private,static。xdxa·只能创建匿名内部类的一个实例。xdxa·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。xdxa·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。xdxaxdxa、用匿名内部类创建多线程有两种方式,和创建一个线程是一样的。xdxa第①种继承Thread:xdxanewThread(){xdxapublicvoidrun(){xdxa//dosomethingxdxa};xdxa}.start();xdxaxdxa第②种实现Runnable接口:xdxanewThread(newRunnable(){xdxapublicvoidrun(){xdxa//dosomethingxdxa};xdxa}){}.start();

您可能感兴趣的文章:

相关文章