读书笔记-java网络编程-3线程-java线程概述
2016-07-03 15:57
459 查看
解决服务器超负荷问题:
- 重用进程
- 采用线程
如果一个应用同时需要大量的长时间链接,就应该考虑异步IO而不是线程。
在主线程中运行上述代码,就会自动的创建一个线程。并运行Thread实例t的run()方法。当然run方法要实现定义好。
通常来说java实现多线程编程主要有两种方式。下面分别介绍:
- 覆盖run方法
- 重写构造器
这里举一个例子:
考虑些一个程序来计算多个文件的安全散列算法(SHA)摘要
IO受限的程序,速度主要受限于从磁盘读取文件所花费的时间,大量时间消耗在阻塞上
- 提供public void run()方法。
- 将其作为参数传递给Thread构造器
通常来说两种实现方式并没什么特别的区别但是建议使用是实现Runnable接口的实现方式,但是大多数程序都可以很方便的转换如下:
- 重用进程
- 采用线程
如果一个应用同时需要大量的长时间链接,就应该考虑异步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(); } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树