GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — Java/DataStructures/Buffers/CircularBuffer.java at master · smeda2205/Java Expand file tree/ Copy pathCircularBuffer.javaMore file actions 129 lines (107 loc) · 3.62 KB / Copy pathCircularBuffer.javaFile metadata and controls129 lines (107 loc) · 3.62 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 package DataStructures.Buffers; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; public class CircularBuffer { private char[] _buffer; public final int _buffer_size; private int _write_index = 0; private int _read_index = 0; private AtomicInteger _readable_data = new AtomicInteger(0); public CircularBuffer(int buffer_size) { if (!IsPowerOfTwo(buffer_size)) { throw new IllegalArgumentException(); } this._buffer_size = buffer_size; _buffer = new char[buffer_size]; } private boolean IsPowerOfTwo(int i) { return (i & (i - 1)) == 0; } private int getTrueIndex(int i) { return i % _buffer_size; } public Character readOutChar() { Character result = null; //if we have data to read if (_readable_data.get() > 0) { result = new Character(_buffer[getTrueIndex(_read_index)]); _readable_data.decrementAndGet(); _read_index++; } return result; } public boolean writeToCharBuffer(char c) { boolean result = false; //if we can write to the buffer if (_readable_data.get() < _buffer_size) { //write to buffer _buffer[getTrueIndex(_write_index)] = c; _readable_data.incrementAndGet(); _write_index++; result = true; } return result; } private static class TestWriteWorker implements Runnable { String _alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; Random _random = new Random(); CircularBuffer _buffer; public TestWriteWorker(CircularBuffer cb) { this._buffer = cb; } private char getRandomChar() { return _alphabet.charAt(_random.nextInt(_alphabet.length())); } public void run() { while (!Thread.interrupted()) { if (!_buffer.writeToCharBuffer(getRandomChar())) { Thread.yield(); try { Thread.sleep(10); } catch (InterruptedException e) { return; } } } } } private static class TestReadWorker implements Runnable { CircularBuffer _buffer; public TestReadWorker(CircularBuffer cb) { this._buffer = cb; } @Override public void run() { System.out.println("Printing Buffer:"); while (!Thread.interrupted()) { Character c = _buffer.readOutChar(); if (c != null) { System.out.print(c.charValue()); } else { Thread.yield(); try { Thread.sleep(10); } catch (InterruptedException e) { System.out.println(); return; } } } } } public static void main(String[] args) throws InterruptedException { int buffer_size = 1024; //create circular buffer CircularBuffer cb = new CircularBuffer(buffer_size); //create threads that read and write the buffer. Thread write_thread = new Thread(new TestWriteWorker(cb)); Thread read_thread = new Thread(new TestReadWorker(cb)); read_thread.start(); write_thread.start(); //wait some amount of time Thread.sleep(10000); //interrupt threads and exit write_thread.interrupt(); read_thread.interrupt(); } } |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |