博文
一个简单的线程池(2006-05-09 16:06:00)
摘要:此代码来自《java游戏编程》,北京希望电子出版社。David Brackeen著 邱仲潘译。线程池的入门代码。站长整理。 import java.util.LinkedList; public class ThreadPool extends ThreadGroup {//作为线程组来实现线程池,新颖 private boolean isAlive;//此线程池是否激活 private LinkedList taskQueue;//存放任务的链表 private int threadID;//线程池中的线程数 private static int threadPoolID;//用来记数,实例化了多少个线程池对象 /** 创建一个新的线程池. @param numThreads 池中的线程数. */ public ThreadPool(int numThreads) { super("ThreadPool-" + (threadPoolID++)); setDaemon(true); isAlive = tru......
Java解析网络数据流的三种特殊方法(2006-05-09 16:05:00)
摘要:
Java作为最开放的语言,已越来越受到网络程序员的青睐。但这一青睐族有着同样的经历——曾经都为网络上通信的Java数据格式而烦脑。 笔者也不例外,曾经为此而查阅了很多文档,经过反复测试才得以解决,如今笔者已经在所从事的很多电子政务项目中顺利的应用。今天笔者写此文,介绍用Java解析网络数据的三种特殊方法,希望对正在寻求这方面问题答案的读者有所帮助。 UTF8转换成GB2312 当我们在基于HTTP协议的JSP或Servlet的应用中获取数据或发送请求时,JVM会把输送的数据编码成UTF8格式。如果我们直接从HTTP流中提取中文数据,提取的结果为“????”(可能更多问号),为转换成我们能够理解的中文字符,我们需要把UTF8转换成GB2312,借助ISO-8859-1标准编码能够轻易的实现,下面的代码实现了这一功能: byte [] b; String utf8_value; utf8_value = request.getParameter("NAME");//从HTTP流中取"NAME"的UTF8数据 b = utf8_value.getBytes("8859_1"); //中间用ISO-8859-1过渡 String name = new String(b, "GB2312"); //转换成GB2312字符 在知道流长度的情况下将输入流转换成字节数组 Java中的输入流抽象类InputStream有int read(byte[] b, int off, int len)方法,参数中byte[] b是用来存放从InputStream中读取的数据,int off指定数组b的偏移地址,也就是数组b的起始下标,int len指定需要读取的长度,方法返回实际读取的字节数。刚学Java的朋友可能要说:先定义一个与流长度等长的字节数组,调用read方法,指定起始下标为0,指定读......
告别System.out.print()(2006-05-09 16:04:00)
摘要:告别System.out.print() —J2SDK1.4新增Java日志框架 (作者:Sonzhang Zhao ) J2SDK1.4的Java日志框架,其实总结起来主要是下面几点: 命名空间:空间外层包含内层的设置 Handler:可以将日志信息放入内容,定向到文件,或控制台等 Lever:规定日志的级别,低级别的日志可以被忽略 Formatter:负责将日志进行格式化,这样出来的东西比较好看一点 引言 作为一名Java 程序员,最熟悉的、使用最多的调用恐怕莫过于System.out.print(“…”)。当你没有调试工具而要跟踪一个变量的值得时候;当你需要显示捕获的Exception、Error的时候;当你想知道程序在运行的时候究竟发生了什么的时候,通常的做法就是调用System.out.print把他们在终端、控制台上打印出来。这种方式对于输出信息的分类、格式化及永久保存带来诸多不便。虽然我们可以把它写入一个文件然后进行分析,但是这要需要编写额外的程序代码,其成本不可忽视!而由此给目标系统本身增加的复杂程度不可避免的使开发、调试陷入一个深深的迷潭。 JDK1.4的推出,使得这一切即将成为历史。让我们向System.out.print()告别吧,使用Java Logging API为自己的程序构建一个完整的日志记录系统! 一、第一个实例 先看一个简单的实例:SimpleLoggingTest.java import java.util.logging.*; public class SimpleLoggingTest { public static void main(String args[]) { //程序的其它处理  ......
手把手教您如何编写一个动画Applet实例 (2006-05-09 16:03:00)
摘要:Applet是在浏览器中运行的小程序,Java也是从Applet开始风靡世界的。通过编写这个Applet,我们可以学习到如下知识:1、Applet及JApplet中的主要接口2、图像的装载及MediaTracker的使用3、线程的使用及多个线程直接的通讯4、Thread.join()方法的使用5、volatile关键字的使用动画的主要部分是一个Applet,从codebase中读取一组图片文件,然后每隔1秒轮换显示一张。代码如下:
import javax.swing.JApplet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
public class Animate extends JApplet
{
//图片数量
private static final int NUM_OF_PIC = 4;
int count;
Image pics[];
TimerThread timer;
public void init()
{
count = 1;
pics = new Image[NUM_OF_PIC];
MediaTracker tracker =
new MediaTracker(this);
for(int i = 0; i<NUM_OF_PIC; i++)
{
//将图片按照0,1,...,NUM_OF_PIC -1,
放置在目录中,格式为.jpg
pics[i] = getImage(getCodeBase(),
new Integer(i).toString()+".jpg");
tracker.addImage(pics[i], 0);
}
tracker.checkAll(true);
}
......
深入理解Java对象实例生成的例子(2006-05-09 16:03:00)
摘要:class A {
public int Avar;
public A() {
System.out.println("AAA");
doSomething();
}
public void doSomething() {
Avar = 1111;
System.out.println("A.doSomething()");
}
}
public class B extends A {
public int Bvar = 2222;
public B() {
System.out.println("BBB");
doSomething();
System.out.println("Avar=" + Avar);
}
public void doSomething() {
System.out.println("Bvar=" + Bvar);
}
public static void main(String[] args) {
new B();
}
}
讲解:顺序是这样得,首先生成B就得先生成A(没有父,哪来子)所以调用A的构造器,输出AAA,然后调用方法dosomething,!!!注意:A的该方法被B覆盖,而你生成的是B的对象,所以它调用B的方法,由于BVAR目前没有给定值,所以自动初始化为0,然后生成B对象,先初始化变量BVAR,然后调用构造器输出BBB,然后调用方法,这时BVAR已初始化,所以输出BVAR=2222,而对象A中变量AVAR由于没有调用对象A的方法dosomething,所以其值为0,则输出0 全部输出就如下:
AAA Bvar=0 BBB Bvar=2222 Avar=0 注意:初始化顺序,当继承时,先生成超类对象,生成对象时,先生成静态变量,然后是一般变量,然后调用构造器!当所以超类对象生成后,生成本对象,顺序一样! 当方法被覆盖时,调用目前对象的方法!这得注意。
下面这个题目你能选对答案吗?:What will happen when you attempt to compile and run the following ......
Java中static用法(2006-05-09 16:02:00)
摘要:
一、static
请先看下面这段程序:
public class Hello{ public static void main(String[] args){ //(1) System.out.println("Hello,world!"); //(2) } }
看过这段程序,对于大多数学过Java 的从来说,都不陌生。即使没有学过Java,而学过其它的高级语言,例如C,那你也应该能看懂这段代码的意思。它只是简单的输出“Hello,world”,一点别的用处都没有,然而,它却展示了static关键字的主要用法。
在1处,我们定义了一个静态的方法名为main,这就意味着告诉Java编译器,我这个方法不需要创建一个此类的对象即可使用。你还记得你是怎么运行这个程序吗?一般,我们都是在命令行下,打入如下的命令:
javac Hello.javajava HelloHello,world!
这就是你运行的过程,第一行用来编译Hello.java这个文件,执行完后,如果你查看当前,会发现多了一个Hello.class文件,那就是第一行产生的Java二进制字节码。第二行就是执行一个Java程序的最普遍做法。执行结果如你所料。在2中,你可能会想,为什么要这样才能输出。好,我们来分解一下这条语句。(如果没有安装Java文档,请到Sun的官方网站浏览J2SE API)首先,System是位于java.lang包中的一个核心类,如果你查看它的定义,你会发现有这样一行:public static final PrintStream out;接着再进一步,点击PrintStream这个超链接,在METHOD页面,你会看到大量定义的方法,查找println,会有这样一行:
public void println(String x)。
好了,现在你应该明白为什么我们要那样调用了,out是System的一个静态变量,所以可以直接使用,而out所属的类有一个println方法。
静态方法
通常,在一个类中定义一个方法为static,那就是说,用类名......
一个简单GUI的创建(2006-05-09 11:13:00)
摘要:import javax.swing.*;import java.awt.*;import java.awt.event.*;public class FrameDemo1{ public static void main(String args[]) { JFrame frame=new JFrame("My frame"); Container c=frame.getContentPane(); c.setLayout(new FlowLayout()); JLabel lb=new JLabel("FrameDemo"); JTextField tf=new JTextField("我是菜鸟 但我要飞!!!"); JButton bt1=new JButton("Botton1"); JButton bt2=new JButton("Botton2"); JButton jButton1=new JButton("Botton11"); jButton1.setBackground(Color.pink); jButton1.setBorder(BorderFactory.createRaisedBevelBorder()); jButton1.setToolTipText("click me"); jButton1.setText("I have been changde "); c.add(lb); c.add(tf); c.add(bt1); c.add(bt2); frame.setSize(400,100);
frame.show(); frame.addWindowListener(new WindowAdapter() { public void windo......
计算器(四则运算完全成立并且能连续符号运算没完成)排错没做(2006-05-09 10:54:00)
摘要://摸版没搞,大概只有本人能读!!
import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.lang.Math;
public class test extends JFrame{ static int count=0,all=0,but; static String fuhao,output=""; private JLabel promptLabel; protected static JTextField inputField; private JTextArea outputArea; private JButton j0,j1,j2,j3,j4,j5,j6,j7,j8,j9,x1,x2,y1,y2,s1,s2; static int cont[]=new int[9]; static int paixu[]=new int[50]; private String fuhaoString[]=new String[50]; public test(){ super("ceshi StringTokenizer"); Container container=getContentPane(); container.setLayout(new FlowLayout()); promptLabel=new JLabel("计算器"); container.add(promptLabel); inputField=new JTextField(20); inputField.addActionListener(new ActionListener(){ p......
计算器(四则运算完全成立)排错没做(2006-05-08 16:15:00)
摘要://摸版没搞,大概只有本人能读!!
import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.lang.Math;
public class test extends JFrame{ static int count=0,all=0,but; static String fuhao,output=""; private JLabel promptLabel; protected static JTextField inputField; private JTextArea outputArea; private JButton j0,j1,j2,j3,j4,j5,j6,j7,j8,j9,x1,x2,y1,y2,s1,s2; static int cont[]=new int[9]; static int paixu[]=new int[50]; public test(){ super("ceshi StringTokenizer"); Container container=getContentPane(); container.setLayout(new FlowLayout()); promptLabel=new JLabel("计算器"); container.add(promptLabel); inputField=new JTextField(20); inputField.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event){&nbs......
Java的内存泄漏 出自:ibm:developerworks中国网站 欧(2006-05-05 15:28:00)
摘要:一 问题的提出Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。随着越来越多的服务器程序采用Java技术,例如JSP,Servlet, EJB等,服务器程序往往长期运行。另外,在很多嵌入式系统中,内存的总量非常有限。内存泄露问题也就变得十分关键,即使每次运行少量泄漏,长期运行之后,系统也是面临崩溃的危险。二 Java是如何管理内存为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。为了更好理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。以下,我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。以下右图,就是左边程序运行到第6行的示意图。Java使用有向图的方式进行内存管理,可......
