Java线程教程 – Java线程生产者/消费者 生产者/消费者是使用wait()和notify()方法的典型线程同步问题。 例子 有四个类:缓冲区,生产者,消费者和生产者CumerumerTest。 Buffer类的一个对象具有一个整数数据元素,它将由生产者生成并由消费者消费。 我们必须同步对缓冲区的访问,因此只有当缓冲区为空时,生产者才产生一个新的数据元素,而消费者只有在可用时才消耗缓冲区的数据。 ProducerConsumerTest类用于测试程序。 import java.util.Random; class Consumer extends Thread { private Buffer buffer; public Consumer(Buffer buffer) { this.buffer = buffer; } public void run() { int data; while (true) { data = buffer.consume(); } } } public class Main { public static void main(String[] args) { Buffer buffer = new Buffer(); Producer p = new Producer(buffer); Consumer c = new Consumer(buffer); p.start(); c.start(); } } class Producer extends Thread { private Buffer buffer; public Producer(Buffer buffer) { this.buffer = buffer; } public void run() { Random rand = new Random(); while (true) { int n = rand.nextInt(); buffer.produce(n); } } } class Buffer { private int data; private boolean empty; public Buffer() { this.empty...
Log4j教程 – Log4j日志到数据库 我们可以使用log4j API通过使用org.apache.log4j.jdbc.JDBCAppender对象将信息记录到数据库中。 下表列出了JDBCAppender的配置属性。 属性 描述 bufferSize 设置缓冲区大小。默认大小为1。 driver JDBC驱动程序类。默认为sun.jdbc.odbc.JdbcOdbcDriver。 layout 设置布局。默认是org.apache.log4j.PatternLayout。 password 设置数据库密码。 sql 指定用于每个日志记录请求的SQL语句。 URL 设置JDBC URL user 设置数据库用户名 例子 首先,创建一个表来存储日志信息。 CREATE TABLE LOGS (USER_ID VARCHAR(20) NOT NULL, DATED DATE NOT NULL, LOGGER VARCHAR(50) NOT NULL, LEVEL VARCHAR(10) NOT NULL, MESSAGE VARCHAR(1000) NOT NULL ); 然后,为JDBCAppender创建配置文件log4j.properties,该文件控制如何连接到数据库以及如何将日志消息存储到LOGS表。 # Define the root logger with appender file log4j.rootLogger = DEBUG, DB # Define the DB appender log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender # Set JDBC URL log4j.appender.DB.URL=jdbc:mysql://localhost/Your_Database_Name # Set Database Driver log4j.appender.DB.driver=com.mysql.jdbc.Driver # Set database user name and password log4j.appender.DB.user=your_user_name log4j.appender.DB.password=your_password # Set the SQL statement to be executed. log4j.appender.DB.sql=INSERT INTO LOGS VALUES("%x","%d","%C","%p","%m") # Define the layout for file appender log4j.appender.DB.layout=org.apache.log4j.PatternLayout 以下代码显示如何将信息记录到数据库中。 import org.apache.log4j.Logger; import java.sql.*; import java.io.*; import java.util.*; public class Main{ static...
Log4j教程 – Log4j HelloWorld 我们使用以下配置文件来控制log4j。 根记录器的级别定义为DEBUG,并将名为FILE的追加器附加到它。 追加器FILE定义为org.apache.log4j.FileAppender,并写入位于日志目录中的名为“log.out”的文件。 定义的布局模式为%m%n,它打印以换行符结尾的日志消息。 # Define the root logger with appender file log = c:/log4j log4j.rootLogger = DEBUG, FILE # Define the file appender log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=${log}/log.out # Define the layout for file appender log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.conversionPattern=%m%n log4j在Java代码中 以下Java类展示了如何使用Log4J日志库。 import org.apache.log4j.Logger; import java.io.*; import java.sql.SQLException; import java.util.*; public class Main { /* Get actual class name to be printed on */ static Logger log = Logger.getLogger( log4jExample.class.getName()); public static void main(String[] args) throws IOException,SQLException{ log.debug("Hello this is an debug message"); log.info("Hello this is an info message"); } } 所有库都应该在CLASSPATH中可用,log4j.properties文件应该在PATH中可用。
Lucene教程 – Lucene搜索文件 搜索过程是进行搜索的过程。 下表列出了在搜索过程中使用的类。 类 描述 IndexSearcher 读取/搜索索引处理后创建的索引。 Term 搜索的最低单位。它类似于索引过程中的字段。 Query 抽象类,包含各种实用程序方法,是所有类型查询的父类。 TermQuery TermQuery是一个查询对象,我们可以使用它来创建许多复杂的查询。 TopDocs TopDocs存储前N个搜索结果。 例子 以下代码显示如何搜索索引的文件。 /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT...