[练习]java摘要
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程序通过流来完成输入/输出。流是生产或消费信息的抽象。
流是处理输入/输出的一个洁净的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,
流的概念
Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输
出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的
方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流
能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流
可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如
它不需要代码理解键盘和网络的不同。Java中流的实现是在java.io包定义的类层次结构内部
的。
字节类和字符类。字节流(byte stream)为处理字节的输入和输出提供了方便的方法。例如
使用字节流读取或
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
写二进制数据。字符流(characterstream)为字符的输入和输出处理提供了
方便。它们采用了统一的编码标准,因而可以国际化。当然,在某些场合,字符流比字节流更
有效。
Java 2中读取控制台输入的首选方法是字符流,它使程序容易符合国际标准并且易于维护。
记住,在你学习Java或调试程序时用System.out向控制台写简单文本输出是没有错的。
但是使用PrintWriter使实际的应用程序更容易国际化。
。在Java中,所有的文件都是字节形式的。 Java提供从文件读写字节的方法。
如果object是指定的类型或者可以被强制 转换成指定类型,instanceof将它评估成true,若不是,则结果为false。
object instanceof type
很多本机方法是用C写的。把C代码结合到Java 程序中的机制是调用Java Native
Interface (JNI)。
12.10 本 机 方 法
尽管这种情况极少发生,你也许希望调用不是用Java语言写的子程序。通常,这样的
子程序是CPU的或是你所工作环境的执行代码——也就是说,本机代码。例如,你希望调
用本机代码子程序来获得较快的执行时间。或者,你希望用一个专用的第三方的库,例如
统计学包。然而,因为Java程序被编译为字节码,字节码由Java运行时系统解释(或动态编
译),看起来在Java程序中调用本机代码子程序是不可能的。幸运的是,这个结论是错误
的。Java提供了native关键字,该关键字用来声明本机代码方法。一旦声明,这些方法可以
在Java程序中被调用,就像调用其他Java方法一样。 为声明一个本机方法,在该方法之前用native修饰符,但是不要定义任何方法体。例如: public native int meth() ; 声明本机方法后,必须编写本机方法并要执行一系列复杂的步骤使它与Java代码链接。
很多本机方法是用C写的。把C代码结合到Java 程序中的机制是调用Java Native
Interface (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 method System.out.println("This is ob.i after the native method:" + ob.i);
}
// declare native method
236 第1 部分 Java 语言
public native void test() ; // load DLL that contains static method static {
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 _ _cplusplus
extern "C" {
#endif /*
* Class: NativeDemo * Method: test
* Signature: ()V
*/ JNIEXPORT void JNICALL Java_NativeDemo_test (JNIEnv *, jobject); #ifdef _ _cplusplus
}
#endif #endif
请特别注意下面一行,该行定义了所要创建的test( )
函数
excel方差函数excelsd函数已知函数 2 f x m x mx m 2 1 4 2拉格朗日函数pdf函数公式下载
的原型:
第12 章 输入/输出、小应用程序和其他主
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
237 JNIEXPORT 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 the test() 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 = %d\n", 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: 10 Starting the native method.
i = 10 Ending 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 String
Character Number StringBuffer
Class Object System
ClassLoader Package (Java 2) Thread
Compiler Process >ThreadGroup
Double Runtime ThreadLocal (Java 2)
Float >RuntimePermission (Java 2) Throwable
>InheritableThreadLocal (Java 2) SecurityManager Void
>Integer >Short >
关于JAVA中的类集
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
: 字典(Dictionary)是一个表示关键字/值存储库的抽象类
散列表(Hashtable)是原始java.util中的一部分同时也是Dictionary的一个具体实现。然
而,Java 2重新设计了散列表(Hashtable)以便它也能实现映射(Map)接口。因此现在
Hashtable也被集成到类集框架中。
格林威治时间(GMT),也称为世界时间(UTC)的时区差。
软件工业还没有得到这种可重用性和互操作性。大应用程序复杂度剧增, 难以维护和升级。部分原因是因为,到目前为止,还没有一个标准的,可移植的方式用于
编写软件组件。为了得到组件软件的好处,首先需要一个组件体系结构,这个体系结构允
许由不同厂商提供的组件组装成应用程序。设计者必须能够选择一个组件,理解其功能,
将其集成进一个应用程序中。当一个组件的新版本出现后,这个新版本组件应非常容易的
与其他已存在的代码互操作。幸运的是,Java Beans提供了一个这样的体系结构
下面列举的优点是Java技术提
供给组件开发人员的:
? 一个Bean拥有Java的“一次编程,随处运行”的特性。 ? 可以使用工具控制一个Bean的属性、事件和方法。 ? Bean在不同地区都可以正常工作,这点对将产品推广至全球非常重要。 ? 辅助软件可以帮助使用者配置Bean。仅在设计时为组件设置参数时才需要此辅助软
件,运行环境中无须包括。
? Bean的配置工作保存在永久存储区域中,在使用时恢复即可。 ? Bean注册接收来自其他对象的事件,并能产生事件送往其他对象。