java摘要.doc_第1页
java摘要.doc_第2页
java摘要.doc_第3页
java摘要.doc_第4页
java摘要.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

wait( ) 告知被调用的线程放弃管程进入睡眠直到其他线程进入相同管程并且调用notify( )。 notify( ) 恢复相同对象中第一个调用 wait( ) 的线程。notifyAll( ) 恢复相同对象中所有调用 wait( ) 的线程。具有最高优先级的线程最先运行。1、线程同步模式之一/ A correct implementation of a producer and consumer.class Q int n;boolean valueSet = false;synchronized int get()if(!valueSet)try wait(); catch(InterruptedException e) System.out.println(InterruptedException caught);System.out.println(Got: + n);valueSet = false;notify();return n;synchronized void put(int n) if(valueSet)try wait(); catch(InterruptedException e) System.out.println(InterruptedException caught);this.n = n;valueSet = true;System.out.println(Put: + n);notify();class Producer implements Runnable Q q;Producer(Q q)this.q = q;new Thread(this, Producer).start();public void run()int i = 0;while(true)q.put(i+);class Consumer implements Runnable Q q;Consumer(Q q)this.q = q;new Thread(this, Consumer).start();public void run() while(true) q.get();class PCFixed public static void main(String args) Q q = new Q();Q p = new Q();new Producer(q);new Consumer(q);System.out.println(Press Control-C to stop.);Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流是处理输入/输出的一个洁净的方法,流的概念Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是在java.io包定义的类层次结构内部的。字节类和字符类。字节流(byte stream)为处理字节的输入和输出提供了方便的方法。例如使用字节流读取或书写二进制数据。字符流(characterstream)为字符的输入和输出处理提供了方便。它们采用了统一的编码标准,因而可以国际化。当然,在某些场合,字符流比字节流更有效。Java 2中读取控制台输入的首选方法是字符流,它使程序容易符合国际标准并且易于维护。记住,在你学习Java或调试程序时用System.out向控制台写简单文本输出是没有错的。但是使用PrintWriter使实际的应用程序更容易国际化。在Java中,所有的文件都是字节形式的。Java提供从文件读写字节的方法。如果object是指定的类型或者可以被强制转换成指定类型,instanceof将它评估成true,若不是,则结果为false。object instanceof type很多本机方法是用C写的。把C代码结合到Java 程序中的机制是调用Java NativeInterface (JNI)。12.10 本 机 方 法尽管这种情况极少发生,你也许希望调用不是用Java语言写的子程序。通常,这样的子程序是CPU的或是你所工作环境的执行代码也就是说,本机代码。例如,你希望调用本机代码子程序来获得较快的执行时间。或者,你希望用一个专用的第三方的库,例如统计学包。然而,因为Java程序被编译为字节码,字节码由Java运行时系统解释(或动态编译),看起来在Java程序中调用本机代码子程序是不可能的。幸运的是,这个结论是错误的。Java提供了native关键字,该关键字用来声明本机代码方法。一旦声明,这些方法可以在Java程序中被调用,就像调用其他Java方法一样。为声明一个本机方法,在该方法之前用native修饰符,但是不要定义任何方法体。例如:public native int meth() ;声明本机方法后,必须编写本机方法并要执行一系列复杂的步骤使它与Java代码链接。很多本机方法是用C写的。把C代码结合到Java 程序中的机制是调用Java NativeInterface (JNI)。该方法学由Java 1.1创建并在Java 2中增强。(Java 1.0是用不同的方法,该方法已经过时),关于JNI的详尽描述超出了本书的范围。但是下面的描述为多数应用程序提供了足够的信息。注意:所需执行的精确的步骤随Java 环境和版本的不同而不同,它还依赖于所要实现的本机方法使用的语言。下面的讨论假定在Windows 95/98/NT/2000环境下。所要实现的本机方法是用C写的。理解该过程的最简单的方法是完成一个例子。开始,输入下面的短程序,该程序使用了一个名为test( )的native方法。/ A simple example that uses a native method.public class NativeDemo int i;public static void main(String args) NativeDemo ob = new NativeDemo();ob.i = 10;System.out.println(This is ob.i before the native method: +ob.i);ob.test(); / call a native methodSystem.out.println(This is ob.i after the native method: +ob.i);/ declare native method236 第1 部分 Java 语言public native void test() ;/ load DLL that contains static methodstatic System.loadLibrary(NativeDemo);注意test( )方法声明为native且不含方法体。简而言之这是我们用语言实现的方法。同时注意static块。像本书前面解释过的,一个static块仅在程序开始执行时执行(更为简单的说,当它的类被加载时执行)。这种情况下,它用来加载包含本地执行方法test( )的动态链接库(你不久就会看到怎样创建这个库)。该库由loadLibrary( )方法加载。loadLibrary( )方法是System类的组成单元。它的一般形式为:static void loadLibrary(String filename)这里,filename是指定保存该库文件名的字符串。在Windows环境下,该文件的扩展名为.DLL。写完程序后,编译它生成NativeDemo.class。然后,你必须用javah.exe生成一个文件:NativeDemo.h(javah.exe包含在JDK中)。在执行test( )时你要包含NativeDemo.h。为生成NativeDemo.h,用下面的命令:javah -jni NativeDemo该命令生成名为NativeDemo.h的头文件。该文件必须包含在实现test()的C文件中。该命令的输出结果如下:/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class NativeDemo */#ifndef _Included_NativeDemo#define _Included_NativeDemo#ifdef _ _cplusplusextern C #endif/* Class: NativeDemo* Method: test* Signature: ()V*/JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *, jobject);#ifdef _ _cplusplus#endif#endif请特别注意下面一行,该行定义了所要创建的test( )函数的原型:第12 章 输入/输出、小应用程序和其他主题 237JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *, jobject);注意函数的名称是Java_NativeDemo_test( )。调用本机函数你必须用这样的名字。也就是说,不是生成一个名为test( )的C函数,而是创建一个名为Java_NativeDemo_test( )函数。加入前缀NativeDemo是因为它把test( )方法作为NativeDemo类的一部分。记住,其他类可以定义它们自己的与NativeDemo定义的完全不同的本地test( )方法。前缀中包括类名的方法解决了区分不同版本的问题。作为一个常规方法,给本机函数取名,前缀中必须包括声明它们的类名。生成了必备的头文件后,可以编写test( )执行文件并把它存在一个名为NativeDemo.c的文件中:/* This file contains the C version of thetest() method.*/#include #include NativeDemo.h#include JNIEXPORT void JNICALL Java_NativeDemo_test(JNIEnv *env, jobject obj)jclass cls;jfieldID fid;jint i;printf(Starting the native method.n);cls = (*env)-GetObjectClass(env, obj);fid = (*env)-GetFieldID(env, cls, i, I);if(fid = 0) printf(Could not get field id.n);return;i = (*env)-GetIntField(env, obj, fid);printf(i = %dn, i);(*env)-SetIntField(env, obj, fid, 2*i);printf(Ending the native method.n);注意此文件包含具有接口信息的jni.h文件。该文件由你的Java 编译器提供。头文件NativeDemo.h预先已由javah创建。该函数中,GetObjectClass( )方法用来获得一个含有NativeDemo类信息的C结构。GetFieldID( )方法返回一个包含该类域名“i”信息的C结构。GetIntField()检索该域原来的值。SetIntField( )存储该域的一个更新值(别的处理其他数据类型的方法参看文件jni.h)。生成NativeDemo.c文件后,必须编译它生成一个DLL文件。用微软C/C+编译器来做,使用下面的命令行:Cl /LD NativeDemo.c它生成了一个名为NativeDemo.dll的文件。该步骤完成,你可以执行Java 程序。该程238 第1 部分 Java 语言序输出如下:This is ob.i before the native method: 10Starting the native method.i = 10Ending the native method.This is ob.i after the native method: 20注意:使用native的特殊环境是依赖于实现和环境的。而且,与JAVA代码接口的指定方式必须改变。你必须仔细考虑完成你Java开发系统文件的本机方法。_java.lang包括了下面这些类:Boolean Long StrictMath (Java 2,1.3)Byte Math StringCharacter Number StringBufferClass Object SystemClassLoader Package (Java 2) ThreadCompiler Process ThreadGroupDouble Runtime ThreadLocal (Java 2)Float RuntimePermission (Java 2) ThrowableInheritableThreadLocal (Java 2) SecurityManager VoidInteger Short 关于JAVA中的类集说明:字典(Dict

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论