1. Java / Говнокод #7445

    +76

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    public class ThreadPoolExecutor implements Executor {
    	private int maximumPoolSize; 	// ìàêñèìàëüíîå êîëè÷åñòâî ïîòîêîâ
    	private long keepAliveTime; 	// âðåìÿ îæèäàíèÿ íîâîé çàäà÷è
    	private Integer poolSize;			// êîëè÷åñòâî ñîçäàííûõ ïîòîêîâ
    	private Vector workQueue;			// î÷åðåäü çàäà÷
    	private Vector threadPool;			// ïóë ïîòîêîâ
    
    	public ThreadPoolExecutor(int maxPoolSize, long time) {
    		this.maximumPoolSize = maxPoolSize;
    		this.keepAliveTime = time;
    		this.poolSize = new Integer(0);
    		workQueue = new Vector();
    		threadPool = new Vector();
    		new Thread() {	
    			public void run() {
    				for (;;) {
    					try {
    						Thread.sleep(keepAliveTime);
    					} catch (InterruptedException e) {
    						System.out.println("interrupted");
    					}
    					interruptIfIdle();
    				}
    			}
    		}.start();
    	}
    
    	public void execute(Runnable task) {
    		if (task == null)
    			throw new NullPointerException();
    		workQueue.addElement(task);
    		for (;;) {
    			int status = addIfUnderMaximumPoolSize(task);
    			if (status > 0)
    				return;
    			if (status == 0) {
    				reject(task);
    				return;
    			}
    		}
    	}
    	
    	public void shutdown() {
    		if (threadPool.size() > 0) 
    			for (int i=0; i < threadPool.size(); i++) {
    				((Thread) threadPool.elementAt(i)).interrupt();
    			}
    	}
    	
    	public void reject(Runnable task) {
    		//
    	}
    	
    	private int addIfUnderMaximumPoolSize(Runnable task) {
    		Thread t = null;
    		int status = 0;
    		synchronized (poolSize) {
    			if (poolSize.intValue() < maximumPoolSize) {
    				Runnable next = (Runnable) workQueue.elementAt(0);
    				workQueue.removeElementAt(0);
    				if (next == task) {
    					status = 1;
    				} else
    					status = -1;
    				t = addThread(next);
    			}	
    		}
    		return status;
    	}
    	
    	private Thread addThread(Runnable task) {
    		Thread thread = new Thread(task);
    		threadPool.addElement(thread);
    		thread.run();
    		poolSize = new Integer(poolSize.intValue()+1);
    		return new Thread();
    	}
    		
    	private void interruptIfIdle() {
    		synchronized (threadPool) {
    			for (int i=0; i < threadPool.size(); i++) {
    				try {
    					((Thread) threadPool.elementAt(i)).interrupt();
    				} finally {
    					poolSize = new Integer(poolSize.intValue()-1);
    				}
    			}
    		}
    	}
    	
    }

    Junior пишет весьма упрощенный ThreadPoolExecutor для BlackBerry (сорри, не тот пост кинул в прошлый раз).

    Запостил: enikey, 04 Августа 2011

    Комментарии (0) RSS

    Добавить комментарий

    Ошибка компиляции комментария:
    1. Гости могут высказаться только во вторник, пятницу или субботу
    ava Семь раз отмерь — один отрежь, guest!
    А не использовать ли нам bbcode?
    • [b]жирный[/b] — жирный
    • [i]курсив[/i] — курсив
    • [u]подчеркнутый[/u] — подчеркнутый
    • [s]перечеркнутый[/s] — перечеркнутый
    • [blink]мигающий[/blink] — мигающий
    • [color=red]цвет[/color] — цвет (подробнее)
    • [size=20]размер[/size] — размер (подробнее)
    • [code=<language>]some code[/code] (подробнее)
    Проверочный код