ByteFIFOTest.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:3k
源码类别:

进程与线程

开发平台:

Java

  1. import java.io.*;
  2. public class ByteFIFOTest extends Object {
  3. private ByteFIFO fifo;
  4. private byte[] srcData;
  5. public ByteFIFOTest() throws IOException {
  6. fifo = new ByteFIFO(20);
  7. makeSrcData();
  8. System.out.println("srcData.length=" + srcData.length);
  9. Runnable srcRunnable = new Runnable() {
  10. public void run() {
  11. src();
  12. }
  13. };
  14. Thread srcThread = new Thread(srcRunnable);
  15. srcThread.start();
  16. Runnable dstRunnable = new Runnable() {
  17. public void run() {
  18. dst();
  19. }
  20. };
  21. Thread dstThread = new Thread(dstRunnable);
  22. dstThread.start();
  23. }
  24. private void makeSrcData() throws IOException {
  25. String[] list = {
  26. "The first string is right here",
  27. "The second string is a bit longer and also right here",
  28. "The third string",
  29. "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
  30. "0123456789",
  31. "The last string in the list"
  32. };
  33. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  34. ObjectOutputStream oos = new ObjectOutputStream(baos);
  35. oos.writeObject(list);
  36. oos.flush();
  37. oos.close();
  38. srcData = baos.toByteArray();
  39. }
  40. private void src() {
  41. try {
  42. boolean justAddOne = true;
  43. int count = 0;
  44. while ( count < srcData.length ) {
  45. if ( !justAddOne ) {
  46. int writeSize = (int) ( 40.0 * Math.random() );
  47. writeSize = Math.min(writeSize, srcData.length - count);
  48. byte[] buf = new byte[writeSize];
  49. System.arraycopy(srcData, count, buf, 0, writeSize);
  50. fifo.add(buf);
  51. count += writeSize;
  52. System.out.println("just added " + writeSize + " bytes");
  53. } else {
  54. fifo.add(srcData[count]);
  55. count++;
  56. System.out.println("just added exactly 1 byte");
  57. }
  58. justAddOne = !justAddOne;
  59. }
  60. } catch ( InterruptedException x ) {
  61. x.printStackTrace();
  62. }
  63. }
  64. private void dst() {
  65. try {
  66. boolean justAddOne = true;
  67. int count = 0;
  68. byte[] dstData = new byte[srcData.length];
  69. while ( count < dstData.length ) {
  70. if ( !justAddOne ) {
  71. byte[] buf = fifo.removeAll();
  72. if ( buf.length > 0 ) {
  73. System.arraycopy(buf, 0, dstData, count, buf.length);
  74. count += buf.length;
  75. }
  76. System.out.println(
  77. "just removed " + buf.length + " bytes");
  78. } else {
  79. byte b = fifo.remove();
  80. dstData[count] = b;
  81. count++;
  82. System.out.println(
  83. "just removed exactly 1 byte");
  84. }
  85. justAddOne = !justAddOne;
  86. }
  87. System.out.println("received all data, count=" + count);
  88. ObjectInputStream ois = new ObjectInputStream(
  89. new ByteArrayInputStream(dstData));
  90. String[] line = (String[]) ois.readObject();
  91. for ( int i = 0; i < line.length; i++ ) {
  92. System.out.println("line[" + i + "]=" + line[i]);
  93. }
  94. } catch ( ClassNotFoundException x1 ) {
  95. x1.printStackTrace();
  96. } catch ( IOException iox ) {
  97. iox.printStackTrace();
  98. } catch ( InterruptedException x ) {
  99. x.printStackTrace();
  100. }
  101. }
  102. public static void main(String[] args) {
  103. try {
  104. new ByteFIFOTest();
  105. } catch ( IOException iox ) {
  106. iox.printStackTrace();
  107. }
  108. }
  109. }