A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 cat73 于 2014-7-23 23:17 编辑

刚刚学到多线程,就有了个思路,因为线程的切换是随机的,那么可不可以用这种方法来获取随机字符串呢?
于是就开始写了,最后也成功的写出来了,由于初学,代码或许略有些乱,见谅.

本代码可以用于获得一个随机的字符串
优点:几乎不可能被预测
缺点:效率较低,随机性较差,经常出现一些连续的字符
PS.如果你复制后空格都没了,建议复制到eclipse里使用自动整理功能整理一下再看
同时希望能得到各位的宝贵意见~~
  1. package tk.cat73.hm.h127.Thread;

  2. /**
  3. * 利用多线程的原理获取一段随机字符串
  4. * 优点:几乎不可能被预测
  5. * 缺点:效率较低,随机性较差,经常出现一些连续的字符
  6. * @author Cat73
  7. */
  8. class RandString {
  9.         private String rand;

  10.         private void addrand(char r) {
  11.                 synchronized (this) {
  12.                         rand += r;
  13.                 }
  14.         }

  15.         class Tmp extends Thread {
  16.                 char r;
  17.                 int len;

  18.                 Tmp(char r, int len) {
  19.                         this.r = r;
  20.                         this.len = len;
  21.                 }

  22.                 public void run() {
  23.                         for (int i = 0; i < len; i++)
  24.                                 addrand(r);
  25.                 }
  26.         }
  27.         /**
  28.          * 获取一段随机字符串
  29.          * @param len 要获得的字符串长度
  30.          * @param keys 要在返回的字符串中出现的字符
  31.          * @return 返回随机的字符串结果
  32.          */
  33.         public String getRand(int len, char[] keys) {
  34.                 rand = "";
  35.                 int lenForTmp = (int) (len * 1.5 / keys.length + 20);
  36.                 Tmp[] t = new Tmp[keys.length];
  37.                 for (int i = 0; i < keys.length; i++)
  38.                         t[i] = new Tmp(keys[i], lenForTmp);
  39.                 for (int i = 0; i < keys.length; i++)
  40.                         t[i].start();
  41.                 try {
  42.                         for (int i = 0; i < keys.length; i++)
  43.                                 t[i].join();
  44.                 } catch (InterruptedException e) {
  45.                         e.printStackTrace();
  46.                 }
  47.                 System.out.println(rand.length());
  48.                 return rand.substring(rand.length() / 3, rand.length() / 3 + len);
  49.         }
  50. }

  51. public class Thread_128 {
  52.         public static void run() {
  53.                 RandString r = new RandString();
  54.                 char[] str = { '0', '1', '2', '3' };
  55.                 String rand = r.getRand(500, str);
  56.                 System.out.println(rand);
  57.                 System.out.println(rand.length());
  58.         }
  59. }
复制代码



您需要登录后才可以回帖 登录 | 加入黑马