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

46 篇文章 0 订阅
17 篇文章 0 订阅

解决服务器超负荷问题:
- 重用进程
- 采用线程

如果一个应用同时需要大量的长时间链接,就应该考虑异步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();  
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值