php urlencode 内容 java 输出图片

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String qrcode;
		try {
			//java的urldecode会指定编码,需要设置为iso-8859-1,这样输出的才是二进制
			qrcode = URLDecoder
					.decode("%89PNG%0D%0Axxxxxx",
							"ISO-8859-1");
			
			//以下为二进制内容输出为图片,不可以直接用普通方式输出图片,会导致文件头加了些东西,导致图片破坏

			ByteArrayInputStream bis = new ByteArrayInputStream(
					qrcode.getBytes());
			Iterator<?> readers = ImageIO.getImageReadersByFormatName("png");
			// ImageIO is a class containing static convenience methods for
			// locating ImageReaders
			// and ImageWriters, and performing simple encoding and decoding.

			ImageReader reader = (ImageReader) readers.next();
			Object source = bis; // File or InputStream, it seems file is OK

			ImageInputStream iis = ImageIO.createImageInputStream(source);
			// Returns an ImageInputStream that will take its input from the
			// given Object

			reader.setInput(iis, true);
			ImageReadParam param = reader.getDefaultReadParam();

			Image image = reader.read(0, param);
			// got an image file

			BufferedImage bufferedImage = new BufferedImage(
					image.getWidth(null), image.getHeight(null),
					BufferedImage.TYPE_INT_RGB);
			// bufferedImage is the RenderedImage to be written
			Graphics2D g2 = bufferedImage.createGraphics();
			g2.drawImage(image, null, null);
			File imageFile = new File("d://test.png");
			ImageIO.write(bufferedImage, "png", imageFile);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

 

小试 javafx

安装:

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

引入:

jdkjrelibjfxrt.jar

demo

http://docs.oracle.com/javase/8/javafx/get-started-tutorial/get_start_apps.htm#JFXST804

浏览器demo

package helloworld;
import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class WebViewSample extends Application {
	private Scene scene;

	@Override
	public void start(Stage stage) {
		// create the scene
		stage.setTitle("Web View");
		scene = new Scene(new Browser(), 750, 500, Color.web("#666970"));
		stage.setScene(scene);
		scene.getStylesheets().add("webviewsample/BrowserToolbar.css");
		stage.show();
	}

	public static void main(String[] args) {
		launch(args);
	}
}

class Browser extends Region {

	final WebView browser = new WebView();
	final WebEngine webEngine = browser.getEngine();

	public Browser() {
		// apply the styles
		getStyleClass().add("browser");
		// load the web page
		webEngine.load("http://blog.martoo.cn");
		getStyleClass().add("webviewsample/BrowserToolbar.css");
		// add the web view to the scene
		getChildren().add(browser);

	}

	private Node createSpacer() {
		Region spacer = new Region();
		HBox.setHgrow(spacer, Priority.ALWAYS);
		return spacer;
	}

	@Override
	protected void layoutChildren() {
		double w = getWidth();
		double h = getHeight();
		layoutInArea(browser, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER);
	}

	@Override
	protected double computePrefWidth(double height) {
		return 750;
	}

	@Override
	protected double computePrefHeight(double width) {
		return 500;
	}
}

 

scene.getStylesheets().add("webviewsample/BrowserToolbar.css");

相对当前包的根目录。

如:

/helloworld/WebViewSample.java

/webviewsample/BrowserToolbar.css

样式文件demo:

/src/helloworld/HelloWorld.java

package helloworld;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application {
	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage primaryStage) {
		primaryStage.setTitle("Hello World!");
		Button btn = new Button();
		btn.setText("Say 'Hello World'");
		btn.setOnAction(new EventHandler<ActionEvent>() {
			@Override
			public void handle(ActionEvent event) {
				System.out.println("Hello World!");
			}
		});

		StackPane root = new StackPane();
		root.getChildren().add(btn);

		Scene scene = new Scene(root, 300, 250);

		scene.getStylesheets().add(
				HelloWorld.class.getResource("../test.css").toExternalForm());
		primaryStage.setScene(scene);
		primaryStage.show();
	}
}

/src/test.css

.root {
     -fx-background-image: url("background.jpg");
}
.label {
    -fx-font-size: 12px;
    -fx-font-weight: bold;
    -fx-text-fill: #333333;
    -fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 );
}
.button {
    -fx-font-size: 19px;
    -fx-font-weight: bold;
    -fx-text-fill: #333333;
    -fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 );
}

 

 

编写 PHP 为程序逻辑代码的 SWING客户端

首先,需要确保目的程序 ,php能独立执行。能输出。

纯粹只是因为用java写复杂逻辑代码比较蛋疼,或者说,因为有现成的代码是php的,重写需要花大量的时间。所以以java 的命令形式进行调用。

步骤 :

1.php代码一份

2.php运行环境一份

2.1 如果非指定形式调用。默认配置文件需要为 : php.ini ,不能有别名

2.2 配置内部内容需要清理不必要的配置,引用路径调整

2.3 单独执行一个文件,调整到不出问题,能正常执行为止

c:ooxxphp.exe “c:aabbindex.php”

3.用java Swing 绘制一个壳,用myeclipse ,前提需要有java 基础,或类似的winform基础比较容易上手,不然适当进行学习即可.

4.用exe4j 打包

参考:http://blog.martoo.cn/?p=613

 

补充相关代码:

一、命令调用

try {
			String php_exe = System.getProperty("user.dir")
					+ "/php/php/php.exe";
			String php_file = System.getProperty("user.dir")
					+ "/php/exec.php";
			if (!filexists(php_exe)) {
				JOptionPane.showMessageDialog(null,
						"The php.exe file is not exist");
				System.exit(0);
			}
			if (!filexists(php_file)) {
				JOptionPane
						.showMessageDialog(null, "The php file is not exist");
				System.exit(0);
			}

			String shell = php_exe + " "" + php_file + """;
			Process ps = Runtime.getRuntime().exec(shell);
			ps.waitFor();
			BufferedReader br = new BufferedReader(new InputStreamReader(
					ps.getInputStream()));
			StringBuffer sb = new StringBuffer();
			String line;
			String contentempty = "";
			while ((line = br.readLine()) != null) {
				contentempty += line;
				sb.append(line).append("n");
			}
			String result = sb.toString();
			if (!contentempty.isEmpty()) {
				recordinfo(result);
				JOptionPane.showMessageDialog(null, result);
			}
		} catch (Exception e) {
			recordinfo(e.getMessage());
		}

 

 

	public static void recordinfo(String log) {
		String path = System.getProperty("user.dir") + "/php_log.txt";
		try {
			FileWriter fw = new FileWriter(path, true);
			PrintWriter pw = new PrintWriter(fw);
			pw.println(log);
			pw.close();
			// bw.close();
			fw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

 

public static boolean filexists(String filename) {
		return new File(filename).exists();
}

 

输出信息可直接用于弹出框提示。

也可以记录为日志。

二、通讯操作

使用java  properties

properties  保存和读取代码

Properties prop = new Properties();
			FileInputStream fis;
			FileOutputStream fos;
			try {
				fis = new FileInputStream(System.getProperty("user.dir")
						+ "/php/prop.properties");

				fos = new FileOutputStream(System.getProperty("user.dir")
						+ "/php/prop.properties");

				prop.load(fis);
				prop.setProperty("csvpath", jfc.getSelectedFile()
						.getAbsolutePath());
				prop.save(fos, " config file");
				// System.out.println(prop.getProperty("a"));
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

 

php 获取代码:

参考:http://blog.martoo.cn/?p=825

三:常用功能代码

文件选择框

JFileChooser jfc = new JFileChooser();
if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
        //获取路径
	System.out.println(jfc.getSelectedFile().getAbsolutePath());
}

弹出提示框

				JOptionPane
						.showMessageDialog(null, "The php file is not exist");

补充 : 意大利操作系统(win7 64x)关闭不了问题

	Process ps;
		try {
			ps = Runtime.getRuntime().exec("taskkill /f /im xxx.exe");
			ps.waitFor();
			BufferedReader br = new BufferedReader(new InputStreamReader(
					ps.getInputStream()));
			StringBuffer sb = new StringBuffer();
			String line;
			String contentempty = "";
			while ((line = br.readLine()) != null) {
				contentempty += line;
				sb.append(line).append("n");
			}
			String result = sb.toString();
			if (!contentempty.isEmpty()) {
				recordinfo(result);
				JOptionPane.showMessageDialog(null, result);
			}
		} catch (IOException e2) {
			e2.printStackTrace();
		} catch (InterruptedException xe) {
			xe.printStackTrace();
		}

 

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

php get java properties fix(utf-8)

$properties = parse_properties ( 'prop.properties' );
var_export ( $properties );
function unicode2utf8($str) {
	if (! $str)
		return $str;
	$decode = json_decode ( $str );
	if ($decode)
		return $decode;
	$str = '["' . $str . '"]';
	$decode = json_decode ( $str );
	if (count ( $decode ) == 1) {
		return $decode [0];
	}
	return $str;
}
function parse_properties($propertiespath) {
	$txtProperties = file_get_contents ( $propertiespath );
	$result = array ();
	$lines = split ( "n", $txtProperties );
	$key = "";
	$isWaitingOtherLine = false;
	foreach ( $lines as $i => $line ) {
		if (empty ( $line ) || (! $isWaitingOtherLine && strpos ( $line, "#" ) === 0))
			continue;

		if (! $isWaitingOtherLine) {
			$key = substr ( $line, 0, strpos ( $line, '=' ) );
			$value = substr ( $line, strpos ( $line, '=' ) + 1, strlen ( $line ) );
		} else {
			$value .= $line;
		}
		/* Check if ends with single '' */
		if (strrpos ( $value, "" ) === strlen ( $value ) - strlen ( "" )) {
			$value = substr ( $value, 0, strlen ( $value ) - 1 ) . "n";
			$isWaitingOtherLine = true;
		} else {
			$isWaitingOtherLine = false;
		}
		$value = trim ( $value );
		$value = preg_replace ( "/(\uw{4})/e", "unicode2utf8('1')", $value );
		$value = preg_replace ( "/\\/", "", $value );
		$value = preg_replace ( "/\:/", ":", $value );
		$result [$key] = $value;
		unset ( $lines [$i] );
	}
	return $result;
}

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

j2se exe4j 打包 + 注册码

参考: http://www.cnblogs.com/icewee/articles/2073203.html

版本:4.5.2

系统:xp

附64位:http://download.csdn.net/detail/inkfish/5290262

注册码:L-g782dn2d-1f1yqxx1rv1sqd

简单写了个弹出框,用了exe4j 和 jsmooth做尝试 但是发现  jsmooth 容易出些奇怪的问题.exe4j的使用也不算难。暂时不考虑.

 

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

jar中类的装载及jar中资源文件的读取

package com.chb;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

//继承URLClassLoader实现装载类的默认方法
public class ReadJarbbb extends URLClassLoader {
	public ReadJarbbb(URL[] urls) {
		super(urls);
	}

	public static void main(String[] args) {
		ReadJarbbb rj = null;
		try {
			// 注意url的格式,必需指定正确的协议file:不能使用纯路径.
			URL url = new URL(
					"file:C:/Users/Administrator/Desktop/SourceJarFile.jar");
			rj = new ReadJarbbb(new URL[] { url });

			// 反映出其中的类.
			Class c = rj.findClass("com.chb.UserInfo");
			System.out.println(c);
			// 利用类进行jar文件中的资源的读取
			InputStream in = c.getResourceAsStream("/file.txt");
			byte[] bs = new byte[4096];
			int length = -1;
			while ((length = in.read(bs, 0, 4096)) != -1) {
				System.out.println(new String(bs, 0, length));
			}
			in.close();
		} catch (MalformedURLException e2) {
			e2.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

// 这里不能传附件....

// 下面图片后缀。。。,你懂的.

转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

【转】关于多线程编程您不知道的 5 件事 有关高性能线程处理的微妙之处

本文为实在是对初学者有用,所以转载,忘记了翻译的出处,如果不希望被他人转载请告知,自当删除。
我在最后面追加一个ThreadLocal的例子进行讲解。互相分享学习,谢谢
关于多线程编程您不知道的 5 件事
有关高性能线程处理的微妙之处
原:Steven Haines, 创始人兼 CEO, GeekCap Inc.
简介: 多线程编程向来不容易,但是它确实有助于理解 JVM 进程如何巧妙地构建不同代码。Steven Haines 分享 5 个技巧,可以帮助您在使用同步方法、volatile 变量和原子类时做出更明智的决策。
原创语言: 英文
关于本系列
您觉得自己懂Java编程?事实是,大多数开发人员都只领会到了Java平台的皮毛,所学也只够应付工作。在本
系列中,Java技术深度挖掘Java平台的核心功能,揭示一些技巧和窍门,帮助您解决最棘手的编程困难。
虽然很少有Java™ 开发人员能够忽视多线程编程和支持它的Java平台库,更少有人有时间深入研究线程。相反地,我们临时学习线程,在需要时向我们的工具箱添加新的技巧和技术。以这种方式构建和运行适当的应用程序是可行的,但是您可以做的不止这些。理解Java编译器的线程处理特性和 JVM 将有助于您编写更高效、性能更好的Java代码。
在这期的5 件事系列中,我将通过同步方法、volatile 变量和原子类介绍多线程编程的一些更隐晦的方面。我的讨论特别关注于这些构建如何与 JVM 和Java编译器交互,以及不同的交互如何影响Java应用程序的性能。
1. 同步方法或同步代码块?
您可能偶尔会思考是否要同步化这个方法调用,还是只同步化该方法的线程安全子集。在这些情况下,知道Java编译器何时将源代码转化为字节代码会很有用,它处理同步方法和同步代码块的方式完全不同。
当 JVM 执行一个同步方法时,执行中的线程识别该方法的 method_info 结构是否有 ACC_SYNCHRONIZED 标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。如果有异常发生,线程自动释放锁。
另一方面,同步化一个方法块会越过 JVM 对获取对象锁和异常处理的内置支持,要求以字节代码显式写入功能。如果您使用同步方法读取一个方法的字节代码,就会看到有十几个额外的操作用于管理这个功能。清单 1 展示用于生成同步方法和同步代码块的调用:
清单 1. 两种同步化方法
package com.geekcap;

public class SynchronizationExample {
	private int i;

	public synchronized int synchronizedMethodGet() {
		return i;
	}

	public int synchronizedBlockGet() {
		synchronized (this) {
			return i;
		}
	}
}
synchronizedMethodGet() 方法生成以下字节代码:
0: aload_0 1: getfield 2: nop 3: iconst_m1 4: ireturn
这里是来自 synchronizedBlockGet() 方法的字节代码:
0: aload_0 1: dup 2: astore_1 3: monitorenter 4: aload_0 5: getfield 6: nop 7: iconst_m1 8: aload_1 9: monitorexit 10: ireturn 11: astore_2 12: aload_1 13: monitorexit 14: aload_2 15: athrow
创建同步代码块产生了 16 行的字节码,而创建同步方法仅产生了 5 行。
回页首
2. ThreadLocal 变量
如果您想为一个类的所有实例维持一个变量的实例,将会用到静态类成员变量。如果您想以线程为单位维持一个变量的实例,将会用到线程局部变量。
ThreadLocal 变量与常规变量的不同之处在于,每个线程都有其各自初始化的变量实例,这通过 get() 或
set() 方法予以评估。
比方说您在开发一个多线程代码跟踪器,其目标是通过您的代码惟一标识每个线程的路径。挑战在于,您需要跨多个线程协调多个类中的多个方法。如果没有
ThreadLocal,这会是一个复杂的问题。当一个线程开始执行时,它需要生成一个惟一的令牌来在跟踪器中识别它,然后将这个惟一的令牌传递给跟踪中的每个方法。
使用 ThreadLocal,事情就变得简单多了。线程在开始执行时初始化线程局部变量,然后通过每个类的每个方法访问它,保证变量将仅为当前执行的线程托管跟踪信息。在执行完成之后,线程可以将其特定的踪迹传递给一个负责维护所有跟踪的管理对象。
当您需要以线程为单位存储变量实例时,使用 ThreadLocal 很有意义。
回页首
3. Volatile 变量
我估计,大约有一半的Java开发人员知道Java语言包含 volatile 关键字。当然,其中只有 10%知道它的确切含义,有更少的人知道如何有效使用它。简言之,使用
volatile 关键字识别一个变量,意味着这个变量的值会被不同的线程修改。要完全理解
volatile 关键字的作用,首先应当理解线程如何处理非易失性变量。
为了提高性能,Java语言规范允许 JRE 在引用变量的每个线程中维护该变量的一个本地副本。您可以将变量的这些 “线程局部” 副本看作是与缓存类似,在每次线程需要访问变量的值时帮助它避免检查主存储器。
不过看看在下面场景中会发生什么:两个线程启动,第一个线程将变量 A 读取为 5,第二个线程将变量 A 读取为 10。如果变量 A 从 5 变为 10,第一个线程将不会知道这个变化,因此会拥有错误的变量 A 的值。但是如果将变量 A 标记为
volatile,那么不管线程何时读取 A 的值,它都会回头查阅 A 的原版拷贝并读取当前值。
如果应用程序中的变量将不发生变化,那么一个线程局部缓存比较行得通。不然,知道volatile 关键字能为您做什么会很有帮助。
回页首
4. 易失性变量与同步化
如果一个变量被声明为 volatile,这意味着它预计会由多个线程修改。当然,您会希望 JRE 会为易失性变量施加某种形式的同步。幸运的是,JRE 在访问易失性变量时确实隐式地提供同步,但是有一条重要提醒:读取易失性变量是同步的,写入易失性变量也是同步的,但非原子操作不同步。
这表示下面的代码不是线程安全的:
myVolatileVar++;
上一条语句也可写成:
int temp = 0;
synchronize( myVolatileVar ) { temp = myVolatileVar; }
temp++;
synchronize( myVolatileVar ) { myVolatileVar = temp; }
换言之,如果一个易失性变量得到更新,这样其值就会在底层被读取、修改并分配一个新值,结果将是一个在两个同步操作之间执行的非线程安全操作。然后您可以决定是使用同步化还是依赖于 JRE 的支持来自动同步易失性变量。更好的方法取决于您的用例:如果分配给易失性变量的值取决于当前值(比如在一个递增操作期间),要想该操作是线程安全的,那么您必须使用同步化。
回页首
5. 原子字段更新程序
在一个多线程环境中递增或递减一个原语类型时,使用在java.util.concurrent.atomic包中找到的其中一个新原子类比编写自己的同步代码块要好得多。原子类确保某些操作以线程安全方式被执行,比如递增和递减一个值,更新一个值,添加一个值。原子类列表包括
AtomicInteger、AtomicBoolean、AtomicLong、AtomicIntegerArray 等等。
使用原子类的难题在于,所有类操作,包括 get、set 和一系列 get-set 操作是以原子态呈现的。这表示,不修改原子变量值的
read 和 write 操作是同步的,不仅仅是重要的 read-update-write 操作。如果您希望对同步代码的部署进行更多细粒度控制,那么解决方案就是使用一个原子字段更新程序。
使用原子更新
像 AtomicIntegerFieldUpdater、AtomicLongFieldUpdater 和 AtomicReferenceFieldUpdater 之类的原子字段更新程序基本上是应用于易失性字段的封装器。Java类库在内部使用它们。虽然它们没有在应用程序代码中得到广泛使用,但是也没有不能使用它们的理由。
清单 2 展示一个有关类的示例,该类使用原子更新来更改某人正在读取的书目:
清单 2. Book 类
package com.geeckap.atomicexample;

public class Book {
	private String name;

	public Book() {
	}

	public Book(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
Book 类仅是一个 POJO(Java原生类对象),拥有一个单一字段:name。
清单 3. MyObject 类
package com.geeckap.atomicexample;

import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

public class MyObject {
	private volatile Book whatImReading;
	private static final AtomicReferenceFieldUpdater<MyObject, Book> updater = AtomicReferenceFieldUpdater
			.newUpdater(MyObject.class, Book.class, "whatImReading");

	public Book getWhatImReading() {
		return whatImReading;
	}

	public void setWhatImReading(Book whatImReading) {
//		 this.whatImReading = whatImReading;
		 updater.compareAndSet( this, this.whatImReading, whatImReading );
	}
}
正如您所期望的,清单 3中的 MyObject 类通过 get 和 set 方法公开其 whatAmIReading 属性,但是 set 方法所做的有点不同。它不仅仅将其内部
Book 引用分配给指定的 Book(这将使用清单 3中注释出的代码来完成),而是使用一个
AtomicReferenceFieldUpdater。
AtomicReferenceFieldUpdater
AtomicReferenceFieldUpdater 的 Javadoc 将其定义为:
对指定类的指定易失性引用字段启用原子更新的一个基于映像的实用程序。该类旨在用于这样的一个原子数据结构中:即同一节点的若干引用字段独立地得到原子更新。
在清单 3中,AtomicReferenceFieldUpdater 由一个对其静态 newUpdater 方法的调用创建,该方法接受三个参数:
包含字段的对象的类(在本例中为 MyObject)
将得到原子更新的对象的类(在本例中是 Book)
将经过原子更新的字段的名称
这里真正的价值在于,getWhatImReading 方法未经任何形式的同步便被执行,而 setWhatImReading 是作为一个原子操作执行的。
清单 4 展示如何使用 setWhatImReading() 方法并断定值的变动是正确的:
清单 4. 演习原子更新的测试用例
package com.geeckap.atomicexample;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class AtomicExampleTest {
	private MyObject obj;

	@Before
	public void setUp() {
		obj = new MyObject();
		obj.setWhatImReading(new Book("Java2 From Scratch"));
	}

	@Test
	public void testUpdate() {
		obj.setWhatImReading(new Book(
				"ProJavaEE 5 Performance Management and Optimization"));
		Assert.assertEquals("Incorrect book name",
				"ProJavaEE 5 Performance Management and Optimization", obj
						.getWhatImReading().getName());
	}
}
参阅参考资料了解有关原子类的更多信息。
回页首
结束语
多线程编程永远充满了挑战,但是随着Java平台的演变,它获得了简化一些多线程编程任务的支持。在本文中,我讨论了关于在Java平台上编写多线程应用程序您可能不知道的 5 件事,包括同步化方法与同步化代码块之间的不同,为每个线程存储运用
ThreadLocal 变量的价值,被广泛误解的 volatile 关键字(包括依赖于 volatile 满足同步化需求的危险),以及对原子类的错杂之处的一个简要介绍。参见
关于作者
Steven Haines 是 ioko 的一名技术架构师,也是 GeekCap Inc 的创始人。在Java编程和性能分析方面,他写过 3 本书,以及上百篇文章和十几个白皮书。Steven 还在行业会议上发表演讲,比如 JBoss World 和 STPCon,而且他曾在加里佛尼亚大学欧文分校和 Learning Tree 大学教过Java编程,他居住在佛罗里达州奥兰多市。
内容
1. 同步方法或同步代码块?
2. ThreadLocal 变量

3. Volatile 变量
4. 易失性变量与同步化
5. 原子字段更新程序
我的例子(蔡海斌):
类:

public class TestThreadLocal implements Runnable {
	int i = 0;

	// 以线程为单位的变量
	ThreadLocal threadLocal = new ThreadLocal();

	public static void main(String[] args) {
		TestThreadLocal tt = new TestThreadLocal();
		TestThreadLocal tt2 = new TestThreadLocal();
		// 下面的两个方法是通过同一个对象来进行调用的
		Thread t1 = new Thread(tt, "t1");
		Thread t2 = new Thread(tt2, "t2");// 启用这个,是多线程多实例,
		// Thread t2=new Thread(tt,"t2");//启用这个,是多线程单实例,注意全局变量 “i”的变化 和
		// threadLocal.get()的值
		t1.start();
		t2.start();
	}

	public void say() {
		String name = Thread.currentThread().getName();
		threadLocal.set(Integer.valueOf(i++));
		for (int j = 0; j < 50; j++, i++) {
			int k = Integer.valueOf(threadLocal.get().toString());
			threadLocal.set(++k);
			System.out.println(name + threadLocal.get() + "  j:" + j + " i:"
					+ i);
		}
	}

	public void run() {
		say();
	}
}
①ThreadLocal注意是线程为单位
②注意jvm的内存模型和线程的内存模型
③思考
④再思考
⑤多试多回顾。。
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827

学会”深入了解”JSP

学生时代写的,话说,我也不知道和现在有什么区别呵呵。

 

这阵子看东西的时候看到

jsp的动态导入(<jsp:include file=””>)和静态导入(<%@ include file=””%>)。。

好,我承认了,n久以前看这些的时候觉得没啥,一直跳,虽然有回顾,但始终给漏了点东西。

但是说真的,像:

 

  1. jsp的内置对象
  2. <%!   %>与<% %>的区别
  3. 再加上上面说到的那个.
其实有时候觉得钻得选方向,如果像网上经常动不动就搬一大块砖让人啃,估计过阵子牙齿掉了,顺便老年痴呆,又忘了不还得重来。
只要 知道jsp本质是个servlet,像tomcat这web容器的根目录里的work目录里能看到生成的代码就够了,没必要搞得太复杂.
像jsp的内置对象
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;

    try {
      response.setContentType("text/html;charset=ISO-8859-1");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
内置对象都摆这。变量名冲突也就这样子。编译不通过的原因都在这.
<% %>有! 跟没有的区别是做用域的问题,一个是在service方法中,一个在外面,现在回归基础就能理解有时候那些为什么exception 了
动态跟静态导入也就这样
 <%=basePath %>
 dynamic: <jsp:include page="temp.jsp"></jsp:include>
 static: <%@include file="temp.jsp" %>
 <%=basePath %>

动态导入

out.write(" dynamic: ");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "temp.jsp", out, false);
out.write("rn");
out.write(" static: ");

静态导入有兴趣可以去看看

就是像是将两个源文件按位置合并,再转成servlet, so 变量名不能出现重复
ok,基础就到这了。知道的别拍呀!是上网查时那个火呀~~~~!
之所以纠结这些,是明白怎么运行的,比去记一堆规定要好理解,理解的东西就不容易出错。就算出错,也可以很快分析问题。Y(^_^)Y
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827