解决服务器超负荷问题:
- 重用进程
- 采用线程如果一个应用同时需要大量的长时间链接,就应该考虑异步IO而不是线程。
1. java的线程简介:
1.1 java线程实例
Thread t = Thread();
t.start();
在主线程中运行上述代码,就会自动的创建一个线程。并运行Thread实例t的run()方法。当然run方法要实现定义好。
通常来说java实现多线程编程主要有两种方式。下面分别介绍:
1.1.1派生Thread
创建一个类继承Thread类。具体的说通常来说主要做两部分工作:
- 覆盖run方法
- 重写构造器
这里举一个例子:
考虑些一个程序来计算多个文件的安全散列算法(SHA)摘要
IO受限的程序,速度主要受限于从磁盘读取文件所花费的时间,大量时间消耗在阻塞上
package thread;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import javax.xml.bind.DatatypeConverter;
public class DigestThread extends Thread{
private String filename;
public DigestThread(String filename){
this.filename = filename;
}
@Override
public void run(){
try{
FileInputStream in = new FileInputStream(filename);
MessageDigest sha = MessageDigest.getInstance("SHA-256");
DigestInputStream din = new DigestInputStream(in, sha);
while(din.read()!=-1);
din.close();
byte[] digest = sha.digest();
StringBuilder result = new StringBuilder(filename);
result.append(":");
result.append(DatatypeConverter.printHexBinary(digest));
System.out.println(result);
}catch(IOException ex){
System.err.println(ex);
}catch (NoSuchAlgorithmException ex) {
System.err.println(ex);
}
}
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("E:\\tomcat\\webapps\\network\\bin\\thread\\test1.txt");
list.add("E:\\tomcat\\webapps\\network\\bin\\thread\\test2.txt");
list.add("E:\\tomcat\\webapps\\network\\bin\\thread\\test3.txt");
for(String filename:list){
DigestThread t = new DigestThread(filename);
t.start();
}
}
}
1.1.2实现Runnable接口
创建一个实现了Runnable接口的类,并将其作为构造器参数在创建Thread实例的时候传递。具体的说要做两个方面:
- 提供public void run()方法。
- 将其作为参数传递给Thread构造器
通常来说两种实现方式并没什么特别的区别但是建议使用是实现Runnable接口的实现方式,但是大多数程序都可以很方便的转换如下:
package thread;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import javax.xml.bind.DatatypeConverter;
public class DigestRunnable implements Runnable {
private String filename;
public DigestRunnable(String filename) {
this.filename = filename;
}
public void run() {
try{
FileInputStream in = new FileInputStream(filename);
MessageDigest sha = MessageDigest.getInstance("SHA-256");
DigestInputStream din = new DigestInputStream(in, sha);
while (din.read()!=-1) ;
din.close();
byte[] digest = sha.digest();
StringBuilder result = new StringBuilder(filename);
result.append(":");
result.append(DatatypeConverter.printHexBinary(digest));
System.out.println(result);
}catch(IOException ex){
System.err.println(ex);
}catch (NoSuchAlgorithmException ex) {
System.err.println(ex);
}
}
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("E:\\tomcat\\webapps\\network\\bin\\thread\\test1.txt");
list.add("E:\\tomcat\\webapps\\network\\bin\\thread\\test2.txt");
list.add("E:\\tomcat\\webapps\\network\\bin\\thread\\test3.txt");
for(String filename:list){
DigestRunnable dr = new DigestRunnable(filename);
Thread t = new Thread(dr);
t.start();
}
}
}