(Source: hopamviet.com - Ben Thuong Hai)
Dec 14, 2014
Sep 7, 2014
Java Thread Pool tutorial
A thread pool manages the pool of worker threads, it contains a queue that keeps tasks waiting to get executed.
A thread pool manages the collection of Runnable threads and worker threads execute Runnable from the queue.
java.util.concurrent.Executors provide implementation of java.util.concurrent.Executor interface to create the thread pool in java. Let’s write a simple program to explain it’s working.
First we need to have a Runnable class.
Here is the test program where we are creating fixed thread pool from Executors framework.
In above program, we are creating fixed size thread pool of 5 worker
threads. Then we are submitting 10 jobs to this pool, since the pool
size is 5, it will start working on 5 jobs and other jobs will be in
wait state, as soon as one of the job is finished, another job from the
wait queue will be picked up by worker thread and get’s executed.
Here is the output of the above program.
The output confirms that there are five threads in the pool named
from “pool-1-thread-1″ to “pool-1-thread-5″ and they are responsible to
execute the submitted tasks to the pool.
Executors class provide simple implementation of ExecutorService using ThreadPoolExecutor but ThreadPoolExecutor provides much more feature than that. We can specify the number of threads that will be alive when we create ThreadPoolExecutor instance and we can limit the size of thread pool and create our own RejectedExecutionHandler implementation to handle the jobs that can’t fit in the worker queue.
Here is our custom implementation of RejectedExecutionHandler interface.
ThreadPoolExecutor provides several methods using which we can find
out the current state of executor, pool size, active thread count and
task count. So I have a monitor thread that will print the executor
information at certain time interval.
Here is the thread pool implementation example using ThreadPoolExecutor.
Notice that while initializing the ThreadPoolExecutor, we are keeping
initial pool size as 2, maximum pool size to 4 and work queue size as
2. So if there are 4 running tasks and more tasks are submitted, the
work queue will hold only 2 of them and rest of them will be handled by
RejectedExecutionHandlerImpl.
Here is the output of above program that confirms above statement.
Notice the change in active, completed and total completed task count of the executor. We can invoke shutdown() method to finish execution of all the submitted tasks and terminate the thread pool.
If you want to schedule a task to run with delay or periodically then you can use ScheduledThreadPoolExecutor class. Read more about them at Java Schedule Thread Pool Executor.
A thread pool manages the collection of Runnable threads and worker threads execute Runnable from the queue.
java.util.concurrent.Executors provide implementation of java.util.concurrent.Executor interface to create the thread pool in java. Let’s write a simple program to explain it’s working.
First we need to have a Runnable class.
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
| package com.journaldev.threadpool;public class WorkerThread implements Runnable { private String command; public WorkerThread(String s){ this.command=s; } @Override public void run() { System.out.println(Thread.currentThread().getName()+" Start. Command = "+command); processCommand(); System.out.println(Thread.currentThread().getName()+" End."); } private void processCommand() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String toString(){ return this.command; }} |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| package com.journaldev.threadpool;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class SimpleThreadPool { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { Runnable worker = new WorkerThread("" + i); executor.execute(worker); } executor.shutdown(); while (!executor.isTerminated()) { } System.out.println("Finished all threads"); }} |
Here is the output of the above program.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| pool-1-thread-2 Start. Command = 1pool-1-thread-4 Start. Command = 3pool-1-thread-1 Start. Command = 0pool-1-thread-3 Start. Command = 2pool-1-thread-5 Start. Command = 4pool-1-thread-4 End.pool-1-thread-5 End.pool-1-thread-1 End.pool-1-thread-3 End.pool-1-thread-3 Start. Command = 8pool-1-thread-2 End.pool-1-thread-2 Start. Command = 9pool-1-thread-1 Start. Command = 7pool-1-thread-5 Start. Command = 6pool-1-thread-4 Start. Command = 5pool-1-thread-2 End.pool-1-thread-4 End.pool-1-thread-3 End.pool-1-thread-5 End.pool-1-thread-1 End.Finished all threads |
Executors class provide simple implementation of ExecutorService using ThreadPoolExecutor but ThreadPoolExecutor provides much more feature than that. We can specify the number of threads that will be alive when we create ThreadPoolExecutor instance and we can limit the size of thread pool and create our own RejectedExecutionHandler implementation to handle the jobs that can’t fit in the worker queue.
Here is our custom implementation of RejectedExecutionHandler interface.
1
2
3
4
5
6
7
8
9
10
11
12
13
| package com.journaldev.threadpool;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor;public class RejectedExecutionHandlerImpl implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { System.out.println(r.toString() + " is rejected"); }} |
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
| package com.journaldev.threadpool;import java.util.concurrent.ThreadPoolExecutor;public class MyMonitorThread implements Runnable{ private ThreadPoolExecutor executor; private int seconds; private boolean run=true; public MyMonitorThread(ThreadPoolExecutor executor, int delay) { this.executor = executor; this.seconds=delay; } public void shutdown(){ this.run=false; } @Override public void run() { while(run){ System.out.println( String.format("[monitor] [%d/%d] Active: %d, Completed: %d, Task: %d, isShutdown: %s, isTerminated: %s", this.executor.getPoolSize(), this.executor.getCorePoolSize(), this.executor.getActiveCount(), this.executor.getCompletedTaskCount(), this.executor.getTaskCount(), this.executor.isShutdown(), this.executor.isTerminated())); try { Thread.sleep(seconds*1000); } catch (InterruptedException e) { e.printStackTrace(); } } }} |
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
| package com.journaldev.threadpool;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.Executors;import java.util.concurrent.ThreadFactory;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class WorkerPool { public static void main(String args[]) throws InterruptedException{ //RejectedExecutionHandler implementation RejectedExecutionHandlerImpl rejectionHandler = new RejectedExecutionHandlerImpl(); //Get the ThreadFactory implementation to use ThreadFactory threadFactory = Executors.defaultThreadFactory(); //creating the ThreadPoolExecutor ThreadPoolExecutor executorPool = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(2), threadFactory, rejectionHandler); //start the monitoring thread MyMonitorThread monitor = new MyMonitorThread(executorPool, 3); Thread monitorThread = new Thread(monitor); monitorThread.start(); //submit work to the thread pool for(int i=0; i<10; i++){ executorPool.execute(new WorkerThread("cmd"+i)); } Thread.sleep(30000); //shut down the pool executorPool.shutdown(); //shut down the monitor thread Thread.sleep(5000); monitor.shutdown(); }} |
Here is the output of above program that confirms above statement.
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
| pool-1-thread-1 Start. Command = cmd0pool-1-thread-4 Start. Command = cmd5cmd6 is rejectedpool-1-thread-3 Start. Command = cmd4pool-1-thread-2 Start. Command = cmd1cmd7 is rejectedcmd8 is rejectedcmd9 is rejected[monitor] [0/2] Active: 4, Completed: 0, Task: 6, isShutdown: false, isTerminated: false[monitor] [4/2] Active: 4, Completed: 0, Task: 6, isShutdown: false, isTerminated: falsepool-1-thread-4 End.pool-1-thread-1 End.pool-1-thread-2 End.pool-1-thread-3 End.pool-1-thread-1 Start. Command = cmd3pool-1-thread-4 Start. Command = cmd2[monitor] [4/2] Active: 2, Completed: 4, Task: 6, isShutdown: false, isTerminated: false[monitor] [4/2] Active: 2, Completed: 4, Task: 6, isShutdown: false, isTerminated: falsepool-1-thread-1 End.pool-1-thread-4 End.[monitor] [4/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false[monitor] [2/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false[monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: true, isTerminated: true[monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: true, isTerminated: true |
If you want to schedule a task to run with delay or periodically then you can use ScheduledThreadPoolExecutor class. Read more about them at Java Schedule Thread Pool Executor.
Source: Internet
Jun 28, 2014
Các trò chơi thú vị bố có thể dạy con
Hãy
chơi ngoài trời càng nhiều càng tốt: Hai bố con cùng đi trên gờ vỉa hè,
trèo cây, đi bơi, đá bóng, đánh cầu lông, trượt patin, đạp xe đạp, thả
diều...
Khi bé đang không làm gì, hãy rủ bé chơi cùng. Nếu bé đồng ý thì hai bố
con cùng chơi, nếu bé không thích thì phải tôn trọng quyền của bé. Có
thể bé có một kế hoạch khác sẵn sàng rồi. Đừng nghĩ trẻ không biết quyết
định. Nếu bé không bận hãy hỏi câu hỏi mở “Con thích hai bố con mình
chơi trò gì bây giờ?” và để bé tự chọn.
Chọn trò chơi cần hai người. Nghe tưởng buồn cười, nhưng những hoạt
động cần một người như khi bé vẽ, tô tranh, tự đọc sách, chơi đàn... thì
bố không nên ngồi cạnh canh xem con làm thế nào. Cũng giống như khi bạn
làm việc, bạn không muốn bị ai theo dõi. Bé cũng vậy.
|
|
|
Ảnh minh họa: Instablog.com.
|
Trẻ hai tuổi trở lên đã có thể đi bộ được 2 km và cần được luyện tập như thế để phát triển thể chất. Hướng
dẫn con chơi các trò chơi dân gian như chi chi chành chành, chơi
chuyền, chơi ô ăn quan, chơi bắn bi, bịt mắt bắt dê... Những trò chơi
này không tốn kém, lại rất vui trong những ngày phải ở trong nhà.
Giới thiệu cho con những bản nhạc, bài hát mình yêu thích, đương nhiên
là có chọn lọc, hai bố con nằm nghe nhạc với nhau. Bố kể cho con nghe
những kỷ niệm gắn với những bài hát đó. Cùng con làm các nhạc cụ tự tạo
rồi rủ mẹ vào ban nhạc cây nhà lá vườn. Hoặc chỉ đơn giản là bật nhạc và
cả nhà cùng nhảy múa.
Đọc sách cho con nghe là trải nghiệm tuyệt vời cho cả bố và con. Hai bố
con cùng đi mua sách, hướng dẫn con chọn sách có ảnh chụp thật, nội
dung phù hợp với lứa tuổi, chỉ cho con xem giá tiền, để con tự trả tiền.
Hướng dẫn con làm những thí nghiệm khoa học phù hợp với độ tuổi, nhưng
không bao giờ giải thích mà để trẻ tự khám phá như làm cầu vồng bằng đĩa
CD chiếu lên tường nhà cho con đuổi cầu vồng. Tại sao khi bố quay đĩa
sang chỗ khác thì lại không có cầu vồng? Xay sinh tố cho vào tủ làm kem.
Tại sao bây giờ bố rót mà kem lại không chảy nhỉ? Hòa muối vào nước để
làm "biển Chết" và mọi thứ lúc trước chìm thì bây giờ nổi. Sao thế nhỉ?
Chuyện gì đã xảy ra? Để bé tự suy nghĩ.
Nếu bé thích, cho bé tự nghiên cứu cái xe đạp của mình, gọi tên các bộ
phận, lật ngửa xe xem xích xe, phanh hoạt động thế nào. Hai bố con cùng
rửa xe đạp, xe máy, ôtô. Không phải vì tiếc tiền mà bạn đang tạo công ăn
việc làm đồng thời trang bị một vốn từ kha khá cho bé qua việc đó. Vừa
vui vừa là việc thật.
Trời nắng nóng, bơm bể vầy, bật nhạc, pha một bình nước chanh, mang đồ
chơi nước thả hết vào bể, hai bố con cùng tận hưởng bể bơi riêng nhà
mình. Đố con biết tại sao nước làm tuốc bin quay? Tại sao lúc thì tuốc
bin quay nhanh, lúc thì quay chậm? Con thử ước lượng xem mấy cốc nước
mới đầy cái chai rỗng này? Đố con biết cốc nào đựng được nhiều nước hơn.
Đố con biết những con gì sống ở dưới nước? Con gì sống ở nước mặn? Con
gì sống ở nước ngọt? Tại sao nước biển lại mặn? Nước con đang bơi là
nước lấy từ đâu?
Thỉnh thoảng để con thức khuya, cùng con ngắm trăng sao, nhất là những
đêm rằm. Đi dạo dưới ánh trăng rằm là một điều kỳ diệu. Kể cho con nghe
về các hành tinh, về các ngôi sao, về mặt trăng, mặt trời. Tại sao có
hôm mình nhìn thấy nhiều sao có hôm không? Trăng khuyết trăng tròn là vì
lý do gì? Kể về những con tàu vũ trụ đang ở trên không trung, và giúp
con hiểu trái đất thật là bé nhỏ trong vũ trụ bao la, có thể đâu đó có
những nền văn minh khác chỉ là chúng ta chưa biết hết thôi, con yêu.
Thỉnh thoảng hai bố con rủ thêm bạn đến nhà và cắm trại giữa phòng
khách. Ăn trong lều, ngủ trong lều, chơi trong lều. Kể cho con nghe về
các bộ lạc luôn sống trong lều. Lều của họ làm bằng gì, họ sống ở đâu,
nguy hiểm thế nào? Các em bé ở đó phải vất vả ra sao để đi lấy nước, lấy
củi, săn bắn, hái lượm, cho con xem hình ảnh minh họa trên máy tính.
Dành một ngày trong tuần là thời gian chỉ có hai bố con đi picnic, đi
câu cá, đi thăm một ngôi chùa, đi xem phim và ăn bỏng ngô, sưu tầm cái
gì đó ví dụ cánh phượng các màu và chỉ cho con xem sự khác biệt giữa các
sắc đỏ. Làm con quay bằng đài hoa bằng lăng, đi sờ ve, chèo thuyền ra
đầm mua sen, làm thuyền lá sen, đếm cánh hoa sen rụng, xếp cánh hoa theo
trật tự từ nhỏ đến lớn...
Cứ như thế, bất cứ cái gì xung quanh cũng đều có thể biến thành trò
chơi thú vị trong mắt trẻ nếu bố hiểu và dành thời gian cho con mình,
giúp con học kiến thức của nhân loại một cách đơn giản nhất có thể mà
lại chẳng tốn kém. Nếu bạn làm như thế trong suốt những năm trẻ 0-6
tuổi, bạn đã giúp con tích góp được một vốn kiến thức khổng lồ, sẵn sàng
cho việc học sau này. Như thế không một em bé nào sẽ chán học.
Cách để trở thành ông bố tuyệt vời
Là người cha tốt là một trong những thành tựu quan trọng nhất trong cuộc đời người đàn ông.
Dưới đây là vài ý tưởng giúp chuyển bạn từ "tốt" đến "tuyệt vời" trong mắt con.
1. Chào hỏi con thật âu yếm
Khi bạn bước về nhà sau một ngày dài làm việc, hãy dành một vài phút để
ôm hôn và chào hỏi con. Khi một người cha về nhà, nếu anh ấy dành tặng
cho con gái những cái ôm và nụ hôn, cô bé sẽ cười khúc khích và tràn
ngập niềm vui. Đó là khi bạn nói, "Hôm nay con thế nào, công chúa nhỏ
của bố" và "Con có biết bố yêu con thế nào không?". Đừng quên chào hỏi
con trai của bạn bằng cách cù vào xương sườn của bé. Cũng đừng quên hỏi
"Con có khỏe không, cậu bé của bố" và "Bố yêu con rất nhiều". Biết được
rằng cha yêu chúng sẽ khiến lũ trẻ có được niềm hạnh phúc không gì sánh
được.
Bạn phải làm thế nào khi con đã đến tuổi vị thành niên?
Có thể, con bạn sẽ không nói ra, nhưng chúng rất cần sự quan tâm, chú ý
từ bạn. Ngay cả khi chúng chống cự, chỉ cần bỏ qua những thái độ tiêu
cực đó. Ôm con gái của bạn và nói với con rằng con thật xinh đẹp, cha
thật may mắn khi là cha của con. Hãy làm con gái thấy hối hận về những
thái độ tiêu cực và không lặp lại nữa. Hãy để con cảm thấy tình yêu của
bạn. Với một cậu con trai tuổi teen, cậu bé khao khát sự chấp thuận của
bạn, nhưng sẽ không bao giờ nói ra. Vì vậy, hãy tiếp thêm sức mạnh cho
con trai bằng một cái ôm hoặc một cú đập tay. "Con sao rồi, con trai?".
"Bố chắc chắn rằng bố rất yêu con, con trai ạ". Tình yêu ấy sẽ in sâu
vào trái tim và khiến cậu bé không bao giờ quên được.
2. Hãy làm việc cùng con
Điều này sẽ giúp ích khi cô bé hay cậu bé không thể hoàn toàn tập
trung. Mua ống nước tại một cửa hàng thật đơn giản. Đó cũng là thời điểm
bạn có thể dạy cho con làm những gì bạn đang làm với những đồ mà bạn
có. Học một vài thủ thuật sẽ cung cấp những kỹ năng giá trị cho tương
lai của các bé.
|
|
Thậm chí bạn có thể làm nhiều hơn thế như khi đi xe cùng nhau, lắng
nghe con mình. Hãy sẵn sàng để cho trẻ huyên thuyên về bất cứ điều gì
chúng muốn mà không chỉ trích. Những dịp được tiếp xúc gần nhau sẽ khiến
bạn và con trở nên yêu thương và hiểu nhau hơn. Bên cạnh đó, chúng sẽ
cảm thấy được nuông chiều. Đừng quên dạy bảo con những bài học hay trên
đường. Điều đó thậm chí làm cho chuyến đi của bạn đáng nhớ hơn.
3. Kể cho con những câu chuyện về cuộc sống của bạn
Nếu con đã lớn hơn, hãy bắt đầu kể. Trẻ sẽ cảm thấy gần gũi hơn với
không chỉ cha mà còn cả gia đình lớn khi nghe bạn kể những câu chuyện về
thời thơ ấu của mình. Nếu kể những câu chuyện vui, hãy tập hợp tất cả
hình ảnh sinh động và vui vẻ. Nếu bạn hoặc cha của bạn đều phục vụ trong
quân đội, hãy kể cho con biết điều này. Hãy kể cho con biết, những gì
con cần làm để bảo vệ độc lập, tự do. Hãy chia sẻ cuộc sống của bạn với
con, cho con xem những bức ảnh nếu có thể. Hãy kể thành những câu chuyện
ngắn và con bạn chắc chắn sẽ muốn nghe nữa.
4. Dạy con cách làm việc
Không chỉ dạy con cách làm việc mà còn chỉ cho con cách hoàn
thành công việc dễ dàng hơn. Hãy để chúng đi bên cạnh bạn khi bạn giải
thích thế nào là một công việc đã được thực hiện tốt. Khi các con học,
cho phép các con mắc lỗi mà đừng đánh đập, chửi mắng. Yêu thương nhưng
không nuông chiều con. Cuộc sống đầy rẫy những công việc phải làm. Một
đứa trẻ biết học cách làm việc sớm hơn, nó sẽ có một cuộc sống hạnh phúc
và thành công hơn.
Quỳnh Trang (Theo familyshare)
Subscribe to:
Posts (Atom)

