多线程

1. 继承Thread类
2. 实现Runnable接口
3. 匿名类的方式

注: 启动线程是start()方法,run()并不能启动一个新的线程

package multiplethread;
  
import java.io.File;
  
public class TestThread {
  
    public static void search(File file, String search) {
        if (file.isFile()) {
            if(file.getName().toLowerCase().endsWith(".jsp")){
                //当找到.jsp文件的时候,就启动一个线程,进行专门的查找
                new SearchFileThread(file,search).start();
            }
        }
        if (file.isDirectory()) {
            File[] fs = file.listFiles();
            for (File f : fs) {
                search(f, search);
            }
        }
    }
      
    public static void main(String[] args) {
        File folder =new File("D:\\project");
        search(folder,"include");
    }
}

  

package multiplethread;
 
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
 
public class SearchFileThread extends Thread{
 
    private File file;
    private String search;
    public SearchFileThread(File file,String search) {
        this.file = file;
        this.search= search;
    }
     
    public void run(){
        String fileContent = readFileConent(file);
        if(fileContent.contains(search)){
            System.out.printf("找到子目标字符串%s,在文件:%s%n",search,file);
        }
    }
     
    public String readFileConent(File file){
        try (FileReader fr = new FileReader(file)) {
            char[] all = new char[(int) file.length()];
            fr.read(all);
            return new String(all);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
  
    }  
 
}

  



package multiplethread;

import java.util.List;

public class PasswordThread extends Thread{

	private boolean found = false;
	
	private String password;

	private List<String> passwords;

	public PasswordThread(String password, List<String> passwords) {
		this.password = password;
		this.passwords = passwords;
	}
	
	public void run(){
		char[] guessPassword = new char[password.length()];
		generatePassword(guessPassword, password);
	}

	public  void generatePassword(char[] guessPassword, String password) {
		generatePassword(guessPassword, 0, password);
	}

	public  void generatePassword(char[] guessPassword, int index, String password) {
		if (found)
			return;
		for (short i = '0'; i <= 'z'; i++) {
			char c = (char) i;
			if (!Character.isLetterOrDigit(c))
				continue;
			guessPassword[index] = c;
			if (index != guessPassword.length - 1) {
				generatePassword(guessPassword, index + 1, password);
			} else {
				String guess = new String(guessPassword);
				//穷举每次生成的密码,都放进集合中
				passwords.add(guess);
				if (guess.equals(password)) {
					System.out.println("找到了,密码是" + guess);
					found = true;
					return;
				}
				
			}
		}
	}
	
}

  

package multiplethread;

import java.util.List;

public class LogThread extends Thread{
	private boolean found = false;

	private List<String> passwords;

	public LogThread(List<String> passwords) {
		this.passwords = passwords;
		
		this.setDaemon(true);//把记日志的这个线程,设置为守护线程
	}
	
	public void run(){
		while(true){
			while(passwords.isEmpty()){
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			String password = passwords.remove(0);
			System.out.println("穷举法本次生成的密码是:" +password);
		}
	}
	
}

  

package multiplethread;

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

public class TestThread {

	public static boolean found = false;
	
	public static void main(String[] args) {
		String password = randomString(3);
		System.out.println("密码是:" + password);
		List<String> passwords = new ArrayList<>();
		
		new PasswordThread(password,passwords).start();
		new LogThread(passwords).start();
		
	}

	private static String randomString(int length) {
		String pool = "";
		for (short i = '0'; i <= '9'; i++) {
			pool += (char) i;
		}
		for (short i = 'a'; i <= 'z'; i++) {
			pool += (char) i;
		}
		for (short i = 'A'; i <= 'Z'; i++) {
			pool += (char) i;
		}
		char cs[] = new char[length];
		for (int i = 0; i < cs.length; i++) {
			int index = (int) (Math.random() * pool.length());
			cs[i] = pool.charAt(index);
		}
		String result = new String(cs);
		return result;
	}

}

  //

posted on 2020-01-18 21:43  妄想症T  阅读(207)  评论(0编辑  收藏  举报

导航