快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

澳门新葡亰8455手机版本:Java多线程分析词频示例



法度榜样的布局:

实现:

1,共享数据类

package code.words;

import java.io.BufferedReader;

import java.io.File;import java.io.FileInputStream;

import java.io.IOException;import java.io.InputStreamReader;

import java.util.ArrayList;import java.util.List;

import java.util.Map;

public class WordsAnalysis {

/奸淫 @param args

* @throws IOException*/

public static void main(String[] args) throws IOException {

File f = new File("d:\\我的文档\\test");File[] fs = f.listFiles();

// 分成两半List files1 = new ArrayList();

for (int i = 0; i 2; i++) {files1.add(fs[i]);

}

List files2 = new ArrayList();for (int i = fs.length/2; i

files2.add(fs[i]);

}// 事情线程总数

int threadCount = 0;// 共享数据

AllCountModel acm = new AllCountModel();acm.setThreadCount(++threadCount);

ThreadTest tt1 = new ThreadTest(files1, acm);// 1号线程

tt1.start();acm.setThreadCount(++threadCount);

ThreadTest tt2 = new ThreadTest(files2, acm);// 2号线程

tt2.start();MonitorThread mt = new MonitorThread(acm);

// 监视线程mt.start();

}

/**

** @param file

* @param wordsMap* @return

* @thro澳门新葡亰8455手机版本ws IOException*/

public Map countWords(File file, Map wordsMap) throws IOException{

// 读流BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

// 一行字符串String str;

// 读取每一行while((str = reader.readLine()) != null ){

str = str.trim();// 跳过空行

if(str.equals("") || str == null){continue;

}// 按空格分离成单词

String[] strs = str.split(" ");for (int i = 0; i

String word = strs[i].trim();// 重现的单词

if(wordsMap.containsKey(word)){// 计数

wordsMap.put(word, (wordsMap.get(word) + 1));}else{

// 第一次呈现的新单词wordsMap.put(word, 1);

}}

}// 关闭流

reader.close();return wordsMap;

}

/奸淫 打印结果

* @param AllCountModel 共享的结果集*/

public static void show(AllCountModel acm){System.out.println(acm.getThreadCount());

for (List lists : acm.getLastMap().keySet()) {System.out.println(lists);

for (String str : acm.getLastMap().get(lists).keySet()) {System.out.println(str + " : " + acm.getLastMap().get(lists).get(str));

}System.out.println("------------------------------------------");

}

}}

2,事情线程

package code.words;

import java.io.File;

import java.io.IOException;import java.util.ArrayList;

import java.util.List;import java.util.HashMap;

import java.util.Map;

public class ThreadTest extends Thread{

private List files = new ArrayList();private Map wordsMap = new HashMap();

private AllCountModel allCountModel;

// 每一个线程都传入不一样的files,以是不用担心这个工具的同步冲突public ThreadTest(List files, AllCountModel allCountModel){

this.files = files;this.allCountModel = allCountModel;

}

public void run() {WordsAnalysis wa = new WordsAnalysis();

// 解析传入的整个文件for (File file : files) {

try {// 解析文件内容

wordsMap = wa.countWords(file, wordsMap);} catch (IOException e) {

e.printStackTrace();}

}// 锁住共享数据(必须这么做,否则澳门新葡亰8455手机版本共享的数据会混乱)

synchronized (allCountModel) {// 更新线程总数

allCountModel.setThreadCount(allCountModel.getThreadCount() - 1);// 更新结果集

allCountModel.getLastMap().put(files, wordsMap);}

}}

3,检测线程

package code.words;

public class MonitorThread extends Thread{

// 共享数据

private AllCountModel acm;

public MonitorThread(AllCountModel acm){this.acm = acm;

}

public void run() {while(true){

try {// 隔段光阴反省一次

sleep(500);} catch (InterruptedException e) {

e.printStackTrace();}

// 线程整个事情完毕if(0 >= acm.getThreadCount()){

// 打印出结果WordsAnalysis.show(acm);

return;}

}}

}

4,主法度榜样

package code.words;

import java.io.BufferedReader;

import java.io.File;import java.io.FileInputStream;

import java.io.IOException;import java.io.InputStreamReader;

import java.util.ArrayList;import java.util.List;

import java.util.Map;

public class WordsAnalysis {

/奸淫 @param args

* @throws IOException*/

public static void main(S澳门新葡亰8455手机版本tring[] args) throws IOException {

File f = new File("d:\\我的文档\\test");File[] fs = f.listFiles();

// 分成两半List files1 = new ArrayList();

for (int i = 0; i 2; i++) {files1.add(fs[i]);

}

List files2 = new ArrayList();for (int i = fs.length/2; i

files2.add(fs[i]);

}// 事情线程总数

int threadCount = 0;// 共享数据

AllCountModel acm = new AllCountModel();acm.setThreadCount(++threadCount);

ThreadTest tt1 = new ThreadTest(files1, acm);// 1号线程

tt1.start();acm.setThreadCount(++threadCount);

ThreadTest tt2 = new ThreadTest(files2, acm);// 2号线程

tt2.start();MonitorThread mt = new MonitorThread(acm);

// 监视线程mt.start();

}

/**

** @param file

* @param wordsMap* @return

* @throws IOException*/

public Map countWords(澳门新葡亰8455手机版本File file, Map wordsMap) throws IOException{

// 读流BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

// 一行字符串String str;

// 读取每一行while((str = reader.readLine()) != null ){

str = str.trim();// 跳过空行

if(str.equals("") || str == null){continue;

}// 按空格分离成单词

String[] strs = str.split(" ");for (int i = 0; i

String word = strs[i].trim();// 重现的单词

if(wordsMap.containsKey(word)){// 计数

wordsMap.put(word, (wordsMap.get(word) + 1));}else{

// 第一次呈现的新单词wordsMap.put(word, 1);

}}

}// 关闭流

reader.close();return wordsMap;

}

/奸淫 打印结果

* @param AllCountModel 共享的结果集*/

public static void show(AllCountModel acm){System.out.println(acm.getThreadCount());

for (List lists : acm.getLastMap().keySet()) {System.out.println(lists);

for (String str : acm.getLastMap().get(lists).keySet()) {System.out.println(str + " : " + acm.getLastMap().get(lists).get(str));

}System.out.println("------------------------------------------");

}

}}

改进:还有很多必要改进的地方:比如阐发单词时,必要加倍精准,没有过滤掉落非单词内容;线程上的设计完全是凭理想出来的,必然还有更好的线程布局可以代替。

------------------------------------------------

多线程带来的数据共享问题和synchronized关键字的感化:

为什么多线程会引起数据冲突呢:

package code.mytest;

public class Test1 extends Thread{

private String[] strs;

public Test1(String[] strs){

this.strs = strs;}

@Override

public void run() {

while(true){strs[0] = strs[0] + "A";

System.out.println(strs[0]);try {

sleep(500);} catch (InterruptedException e) {

e.printStack澳门新葡亰8455手机版本Trace();}

}

}

public static void main(String[] args) {String[] strs = new String[]{"A"};

Test1 t1 = new Test1(strs);Test1 t2 = new Test1(strs);

Test1 t3 = new Test1(strs);t1.start();

t2.start();t3.start();

}}

上面代码履行的结果:尽管的可以理解到为什么要留意共享数据这个工作了

AA

AAAAAAA

AAAAAAAAAAA

AAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

那么用synchronized关键字后的效果:

public void run() {

while(true){

// 包管在处置惩罚strs时,其他线程不能动这个数据,从而避免了数据冲突synchronized (strs) {

strs[0] = strs[0] + "A";}

System.out.println(strs[0]);try {

sleep(500);} catch (InterruptedException e) {

e.printStackTrace();}

}

}

履行的结果:

AA

AAAAAAA

AAAAAAAAAAA

AAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAAAAAAAAAAAA

AAAAAAAAAAAAA

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: