您的位置:首页 > 理论基础 > 计算机网络

读书笔记-java网络编程-3线程-java线程概述

2016-07-03 15:57 459 查看
解决服务器超负荷问题:

- 重用进程

- 采用线程

如果一个应用同时需要大量的长时间链接,就应该考虑异步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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息