(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 = 1 pool-1-thread-4 Start. Command = 3 pool-1-thread-1 Start. Command = 0 pool-1-thread-3 Start. Command = 2 pool-1-thread-5 Start. Command = 4 pool-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 = 8 pool-1-thread-2 End. pool-1-thread-2 Start. Command = 9 pool-1-thread-1 Start. Command = 7 pool-1-thread-5 Start. Command = 6 pool-1-thread-4 Start. Command = 5 pool-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 = cmd0 pool-1-thread-4 Start. Command = cmd5 cmd6 is rejected pool-1-thread-3 Start. Command = cmd4 pool-1-thread-2 Start. Command = cmd1 cmd7 is rejected cmd8 is rejected cmd9 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: false pool-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 = cmd3 pool-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: false pool-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)
Những điều giản dị dạy con yêu nước
Yêu
quê hương là giúp con trải nghiệm khác biệt của những vùng miền địa lý
khác nhau, hiểu đất nước hình chữ S phong phú đa dạng ra sao.
Giáo dục lòng yêu nước là bài học kỹ năng sống tất cả mọi người quanh
trẻ cần hướng dẫn cho bé ngay từ khi còn nằm trong bụng mẹ, để khi lớn
lên trẻ đã có một kim chỉ nam cho mình. Yêu quê hương trước tiên
là ông bà bố mẹ phải nói tiếng Việt chuẩn, nhưng chuẩn vẫn chưa đủ mà
nói tiếng Việt hay cho con nghe. Từ khi mang thai, bố mẹ đã có thể hát
ru con, đọc sách, kể chuyện cho con nghe, về tháng tư mùa hoa loa kèn,
tháng năm hoa phượng bằng lăng nở rộ, và lũ ve bắt đầu ca lên bài ca mùa
hè náo nức... Cứ như thế ngay từ nhỏ con đã ngấm được một vốn từ giàu
có của tiếng Việt.
Yêu quê hương là giúp con trải nghiệm ẩm thực Việt Nam với những món ăn
khắp mọi miền đất nước và không chê bai đồ ăn vùng này vùng kia không
ngon vì không hợp khẩu vị. Món ăn ở đâu sẽ mang theo ảnh hưởng bởi khí
hậu, thực phẩm, văn hóa, nếp sinh hoạt... của người vùng đó. Nếu mỗi khi
ăn một món lạ, bạn được ai đó giải thích cặn kẽ để hiểu được những điều
sâu xa đằng sau, không ai là không muốn thử món ăn đó.
Ảnh minh họa: Lê Mai Hương.
|
Yêu quê hương là giúp con trải nghiệm tất cả sự khác biệt của những
vùng miền địa lý khác nhau, để từ bé con hiểu đất nước hình chữ S của
mình phong phú đa dạng ra sao. Treo bản đồ Việt Nam lên tường ở mức con
có thể nhìn thấy để ngay từ khi lọt lòng con đã có thể nhìn thấy Việt
Nam. Kể cho con nghe về những chuyến đi công tác, những điều bạn đọc
được về em bé ở các vùng, về cả những điều tốt đẹp và những khó khăn.
Như em bé đi học bằng túi ni lông, phải kéo dây, chèo đò, lội suối nhưng
vẫn vui vẻ hồn nhiên và cười rạng rỡ. Yêu quê hương là giúp con từ nhỏ
biết Việt Nam chỉ là một đất nước trên bản đồ thế giới, nhưng Việt Nam
nằm ở đây, chỗ này con yêu, và con đang sống ở đó với gia đình mình.
Yêu quê hương là giúp con học về những họa sĩ, nhà văn, nhà thơ, nghệ
sĩ, nhà khoa học, các nghệ nhân làng nghề... nổi tiếng của Việt Nam để
con thấy tự hào đất nước mình cũng có những người tài ba lỗi lạc. Đưa
con đi xem triển lãm tranh, thăm các bảo tàng, đi thăm các làng nghề
truyền thống để tự tay làm một món đồ, nghe các nghệ nhân nói chuyện...
Yêu quê hương là luôn làm mẫu và giúp con thực hành văn hóa Việt Nam,
biết chia sẻ, biết kính trên nhường dưới, biết lễ phép, biết chăm sóc
mọi người, thân thiện, hiếu khách, yêu lao động và luôn luôn vươn lên.
Yêu quê hương là hiểu và sử dụng sáng tạo những nguyên vật liệu
thể hiện văn hóa Việt Nam thay vì đồ đi nhập. Mỗi quyết định tiêu dùng
của bạn có thể tạo việc làm cho người Việt Nam khác và để duy trì dược
các làng nghề truyền thống cho muôn đời sau. Thật đáng tiếc khi ra nước
ngoài nhìn thấy nhiều đồ sản xuất tại Việt Nam bán hơn là trong một ngôi
nhà của người Việt Nam, ngay giữa Việt Nam.
Yêu quê hương là cùng chơi những trò chơi dân gian với con để
không phụ thuộc vào đồ chơi nhựa, mà bất cứ cái gì cũng có thể thành trò
chơi thú vị cho con. Yêu quê hương là biết bảo vệ môi
trường, tiêu dùng tiết kiệm mọi nguồn tài nguyên thiên nhiên. Biết trân
trọng những gì đất nước mình đang có. Ngay từ nhỏ hãy nói cho con biết
rằng nước ngọt, không khí sạch, khí đốt, dầu mỏ... đều là những nguồn
tài nguyên có hạn. Hình thành các thói quen bảo vệ môi trường, vứt rác
đúng chỗ, không sử dụng những đồ có hóa chất độc hại, không mua, bán, ăn
những động vật quý hiếm khi đi du lịch...
Yêu quê hương là giúp con nhìn ra những điểm mạnh và cả những
điểm yếu của quê hương mình nhưng không phán xét, không chê bai mà chỉ
cho con biết thực trạng là như vậy. Đất nước nào cũng như bất cứ cá nhân
nào đều có điểm mạnh và điểm yếu. Để bé tự hỏi mình sau này lớn lên sẽ
làm gì để thay đổi những điểm yếu đó. Em bé 3 tuổi rưỡi hỏi “Mẹ ơi, sao
con ông lão ăn mày không nấu cơm cho ông lão hả mẹ?”; “Mẹ không biết con
yêu, nhưng mẹ con mình có thể mời ông gói bánh con mang trong ba lô có
được không?”; “Con đồng ý ạ.”. Tuổi nhỏ làm việc nhỏ, lớn mới làm được
việc lớn.
Làm cha mẹ, nhiệm vụ của chúng ta là nuôi dạy con để độc lập, mỗi một
công dân đều có thể tự lập, cả dân tộc chúng ta sẽ tự lập. Nếu người
Việt Nam không yêu đất nước Việt Nam, không cố gắng xây dựng phát triển
Việt Nam thì trông chờ ai làm điều đó?
Hãy giúp con học cách yêu thương quê hương mình để sau này bé có thể tự
hào nói “Tôi là người Việt Nam. Tôi tự hào là người Việt Nam” khi ra
cộng đồng quốc tế.
Lê Mai Hương
Giáo viên Montessori
Giáo viên Montessori
9 bài học quan trọng cha nên dạy con gái
Cha phải giúp con gái mình nhận ra điểm đặc biệt của bản thân, hiểu rằng con là đặc biệt và duy nhất.
Jim Valvano (một bình luận viên bóng rổ, từng là huấn luyện viên có sự nghiệp lừng lẫy) nói: "Cha tôi đã cho tôi một món quà quý giá nhất trên đời, đó là luôn luôn tin tưởng ở tôi".
Mỗi người cha giữ một vai trò độc tôn trong cuộc sống của con mình, như một "superman" trong mắt con. Đặc biệt, cha là người đàn ông đầu tiên mà con gái nhìn thấy trong cuộc đời nên họ cần có
trách nhiệm sống cho con mình thấy thế nào là đàn ông thực thụ, giúp
con có đủ tự tin để đối mặt với thế giới bằng niềm vui và sức mạnh. Đây
chính là một trong những bài học quan trọng đầu tiên mà một người cha
cần phải dạy cho con gái mình ngay từ khi chúng bước vào cuộc đời:
1. Chỉ cho con thấy rằng con rất đặc biệt
Mỗi người sinh ra đều có nét đặc biệt riêng. Điều quan trọng là tìm ra
được điểm đặc biệt đó. Cha phải giúp con mình nhận ra điểm đặc biệt của
bản thân và hiểu được rằng họ đặc biệt và duy nhất. Một người cha tốt
nên yêu và học cách chấp nhận bản tính của con gái mình. Chắc chắn điều
đó sẽ làm cho bé cảm thấy mình toàn diện và hạnh phúc. Tình yêu mà cha
mẹ dành cho con cái sẽ dạy chúng biết yêu thương chính mình và người
khác. Thái độ sống tích cực sẽ giúp trẻ biết cách nhìn nhận, đánh giá
đúng các giá trị và có cái nhìn đúng đắn về thế giới.
Ảnh: Womanitely.
|
2. Con xứng đáng với những điều tốt nhất trong cuộc sống này
Mỗi người cha đều nghĩ cô công chúa nhỏ của mình xứng đáng với những
điều tốt đẹp nhất trong cuộc sống. Các ông bố nên cố gắng giúp con mình
nhận thức về lòng tự trọng và thuyết phục con gái mình tin rằng mình
xứng đáng được tôn trọng, xứng đáng được yêu và được trân trọng.
Hơn nữa, bản thân người con gái cần biết cách tận hưởng và quý trọng
giây phút hiện tại như món quà tuyệt diệu nhất của cuộc sống. Nếu bạn
muốn con gái mình hạnh phúc thì từ nhỏ hãy dạy chúng rằng đừng ám ảnh về
những điều mà người ta nghĩ gì về mình. "Con có thể đón nhận mọi điều
tốt đẹp mà con xứng đáng có được trong cuộc sống này".
3. Con đủ mạnh mẽ để vượt thắng khó khăn
Một trong những điều quan trọng nhất mà các ông bố nên dạy cho con gái
mình là "Con đủ mạnh mẽ để sống và vượt qua những điều khó khăn". Hãy
dạy con tự tin vào khả năng và không nên sợ hãi thất bại, đồng thời dạy
cho họ hiểu đôi khi chúng ta sẽ phải đối mặt với những thăng trầm, nhưng
không được để nỗi sợ hãi làm mình dừng bước.
Hiện nay, chúng ta thấy phái nữ cũng chiếm nhiều vị trí quan trọng
trong xã hội, nắm trong tay quyền lực và sự tự tin. Quan điểm trọng nam
khinh nữ đang dần bị xóa bỏ. Mặc dù vậy, trong gia đình, các ông bố luôn
là những người có uy quyền trong mắt con gái của họ. Đó là nguyên nhân
vì sao họ nên dạy con mình trở nên mạnh mẽ về cả thể chất và tinh thần.
4. Tự do nói lên suy nghĩ của mình
Đôi khi bạn thấy thật khó để vượt qua nỗi sợ hãi và không dễ dàng khi
nói về những điều mình nghĩ hay cảm nhận thật sự. Khi còn là một đứa
trẻ, trẻ thường ngại đặt ra những câu hỏi. Nhiều cô gái nhút nhát và dịu
dàng, vì vậy những ông bố nên giúp con gái mình thoát khỏi sự do dự,
ngại ngùng. Thay vào đó hãy dạy chúng nói về những suy nghĩ của mình ở
gia đình và bạn cần lắng nghe một cách chăm chú.
5. Nên có tinh thần tự giác
Tinh thần tự giác là một trong những điều quan trọng và là kỹ năng cần
thiết với mỗi người. Điều đó cũng phụ thuộc vào việc bạn giúp con gái
mình trở thành người có tính tự giác.
Tính tự giác có nghĩa tự kiểm soát chính mình, là một dấu hiệu của sức
mạnh nội tâm và kiểm soát cuộc sống. Thái độ cứng rắn có chừng mực của
người bố là yếu tố cần thiết để dạy con gái mình trở thành người có
nguyên tắc, có kỷ luật. Đừng cố gắng trở thành những người cha quá dễ
dãi hay quá hà khắc với con.
6. Phải giữ vững lập trường
Người cha số một là người biết cách bảo vệ gia đình mình. Mỗi người nên
tập để có được kỹ năng giữ vững lập trường của mình. Người cha phải dạy
cho con gái mình biết bảo vệ bản thân hoặc bảo vệ những người họ yêu
quý bởi cuộc sống đầy rẫy xung đột và không thể đoán trước được điều gì sẽ xảy ra.
7. Tự lập
Bài học này cũng thật sự quan trọng với con gái bạn. Cần cho con gái
bạn nhận ra rằng con không nên phụ thuộc vào bất kỳ người đàn ông nào.
Người cha nên giúp đỡ con mình nhận ra điều này, nhưng cũng không nên
hành động như một cái máy ATM mỗi khi con gái mình gặp vấn đề. Các ông
bố phải dạy con mình độc lập về mặt tài chính, không cần đến tiền của
đàn ông cho bất kỳ thứ gì. Thêm vào đó, con gái cũng cần được dạy những
kỹ năng cơ bản để tiết kiệm tiền và chi tiêu phù hợp.
8. Tự tin
Tự tin là hành trang cho con gái bạn. Đó là nền tảng của hạnh phúc và
chìa khóa để có được thành công trong tương lai. Mỗi người cha nên nói
với con mình rằng con là người phụ nữ xinh đẹp và thông minh nhất trên
trái đất. Điều đó sẽ làm tăng sự tự tin ở con bạn và tạo nên sự thành
công trong mọi lĩnh vực của cuộc sống. Các cô gái đều muốn được yêu,
được trân trọng, đặc biệt từ người thân yêu và người mình yêu. Hãy để
con gái bạn trở nên tự tin hơn, chắc chắn bạn sẽ tự hào về con mình.
9. Tình yêu thật sự là tình yêu vô điều kiện
Nicholas Sparks từng nói: "Để trở thành cha mẹ là điều khó nhất trên
đời mà bạn phải làm, nhưng đổi lại nó dạy bạn biết ý nghĩa của tình yêu
vô điều kiện". "Tôi nghĩ rằng mỗi ông bố đều biết một tình yêu thật sự
vô điều kiện là khi ông ấy sẵn sàng yêu vợ, yêu mẹ, yêu con gái, yêu anh
chị em. Bây giờ, họ có trách nhiệm dạy cho con mình biết tình yêu thật
sự là gì. Nó sẽ hình thành nên cái nhìn về một thứ tình cảm vô điều kiện
trong tâm trí trẻ. Bằng cách này, bạn sẽ phát triển và bồi bổ thế giới
nội tâm của con gái mình".
Tóm lại, hãy cho dạy con gái trở thành cây hoa đẹp nhất trong
cuộc sống của bạn. Mỗi người cha nên đủ mạnh mẽ để giúp con mình có sự
tự tin, sự độc lập và tính kỷ luật.
Thi Trân (Theo Womanitely)
May 16, 2014
Khi đất nước lâm nguy
Khi
đất nước lâm nguy thì đòi hỏi rất cao ở trách nhiệm với mỗi công dân.
Trách nhiệm đó không chỉ khi đứng trong đội ngũ có người chỉ huy lãnh
đạo mà ngay cả khi mỗi người dân chỉ là một thành tố tự do trong những
cuộc biểu lộ thái độ có tính tự phát.
Ngẫm lại những ngày ở nước Đức trong những năm 1989 và 1990, nhìn vào
dân tộc họ khi ấy tôi suy nghĩ rất nhiều. Nhà máy của tôi làm khi đó có
tên là Microelechstonichstahnsdord. Đây là một nhà máy quốc doanh chuyên
sản xuất vi điện tử xuất khẩu cho nhiều nước. Do làm bóng bán dẫn và vi
mạch nên có phân xưởng giữ nguyên vật liệu rất quý như phân xưởng mạ
vàng chân các bóng bán dẫn và vi mạch. Nước Đức những năm đó tình hình
rất căng thẳng, khắp nơi biểu tình và có lúc bị đe dọa bởi một cuộc
chiến có thể nổ ra giữa Đông và Tây.
Rồi nước Đức thống nhất để sau đó nhà máy giải tán dần từng bộ phận và
đi tới chỗ bán toàn bộ cho một tập đoàn Ấn Độ. Là đội trưởng đội Việt
Nam, tôi thường phải đi giao ban một tuần hai lần với toàn thể ban lãnh
đạo của nhà máy nên nắm rất chắc tình hình của nhà máy. Không khí xã hội
khi ấy rất phức tạp, nhưng trong thành phố tôi ở và đặc biệt khu nhà
máy tôi mọi hoạt động vẫn rất bình thường. Kể cả khi từng phân xưởng
giải tán rồi tới tận khi nhà máy được bán đi, nhà máy không mất cắp bất
cứ một tài sản nào. Việc quản lý rất chặt chẽ, nhưng nhà máy rất rộng,
ba phía rừng và ruộng lúa mì bao bọc nên nếu ai có hành vi muốn lấy cắp
thì không phải là không thực hiện được.
Tôi đã hỏi nhiều công nhân quen biết và đặc biệt anh bạn thân Lotar,
bảo vệ trưởng của nhà máy, vì sao các bạn lại làm được như thế, khi tài
sản hôm qua thuộc nhà máy của DDR (Cộng hòa Dân chủ Đức), hôm sau thuộc
về BRD (Cộng hòa liên bang Đức) thì đều nhận được câu hỏi chung là:
Chúng tôi là một dân tộc! Quá trình sống với người Đức tôi càng yêu mến
và hiểu họ, mặc dù thể chế có thể thay đổi, nhưng hầu như tất cả công
nhân Đức, ai cũng đều ý thức rõ là, tài sản của nhà máy là của nhà máy,
là của nhân dân Đức nói chung, nó là cái bất khả xâm phạm.
Trong cuộc biến động chính trị đầy âu lo về sự bất ổn ấy, nhà máy không
mất đi một viên gạch, một phân vàng, sau bán trọn vẹn lấy tiền cho công
quỹ quốc gia chính nhờ sự giác ngộ có tính công dân của từng người dân
người Đức, đặc biệt là đội ngũ công nhân trong nhà máy của chúng tôi làm
việc.
Việc thứ hai tôi được chứng kiến là mùa đông năm 1989 tình hình rất
phức tạp, nhất là trong thành phố lớn như ở thủ đô Berlin. Bấy giờ quanh
thủ đô có rất nhiều trại lính của quân đội Nga chiếm đóng theo Hiệp ước
Potsdam sau đại chiến II. Ở Đức bấy giờ cũng xuất hiện nhiều nhóm thanh
niên đầu trọc theo chủ nghĩa dân tộc cực đoan, sẵn sàng gây hấn, sẵn
sàng đập phá và nổi loạn. Những người Đức đa số cũng không thích sự
chiếm đóng của quân đội nước ngoài như Pháp, Mỹ và Nga trên nước họ. Đây
rất dễ là mảnh đất tốt nảy sinh những hành vi phá hoại của những nhóm
phát xít trẻ.
Sát Noel, trời rất lạnh, 25 âm độ về đêm. Chúng tôi lên Berlin phải dứt
khoát qua ga tầu Schoennefeld. Khi đó đã là nửa đêm, ga tàu không một
bóng cảnh sát. Tôi từ đường hầm lên sân ga nổi bỗng nghe tiếng la ó ầm
ầm. Tôi vọt lên sân ga, thấy một tốp đông thanh niên đầu trọc khoảng 50
người, đang la hét, huýt sáo om sòm. Nhiều thanh niên Đức tầm 16, 17 tay
mang theo gậy bóng chầy. Họ đang vây quanh bốn người lính Nga trên sân
ga nổi. Những lính Nga cũng đang chờ ôtô như tôi đi về doanh trại của họ
ở Teltow hay doanh trại nào ở Postdam. Hôm nay là ngày Chủ nhật và họ
được phép đi chơi. Đám đông vẫn la hét quanh bốn lính Nga. Chúng nhổ
bọt, làm nhiều động tác khả ố mà người châu Âu coi là sự nhục mạ ghê
gớm, như chọc ngón cái chỉ xuống đất hay giơ ngón giữa chọc về phía lính
Nga và hét to lên những câu nhục mạ. Tôi nín thở quan sát.
Nhưng những người lính Nga vẫn điềm tĩnh. Trong tay không một tấc vũ
khí, tới dây nịt da to bản họ cũng không thèm cởi ra để tự vệ mà đứng áp
lưng vào nhau như một vòng thành trì nhỏ. Chừng chục phút khiêu khích
vô ích, cũng đúng khi ấy có một chuyến Sbahn về, đổ ra sân ga nhiều
người Đức xuống tàu, những người Đức đầu không trọc và họ quây lấy những
người Nga im lặng như một vòng tròn bảo vệ những người lính đang bị
khiêu khích. Tôi len vào đứng bên những người Đức, cạnh những người lính
Nga hiền lành mà im lặng sừng sững tựa như những bức tượng sống. Không
có sự kiện đáng tiếc nào xảy ra cả.
Sau đó, có thể ai gọi điện, một tốp cảnh sát Đông Đức và quân nhân tuần
tra quân đội Nga tới. Tốp người Đức đầu trọc không la ó nữa và kéo lên
một chuyến tàu đi về Berlin. Tôi đi cùng bốn anh lính Nga lên ôtô về
Teltow. Bao nhiêu năm rồi, trong tai tôi vẫn nghe rõ tiếng gõ gót giầy
rất đều xuống sàn nhà ga đêm ấy của tốp lính Nga. Tiếng gõ giày như nhịp
tiếng bát trầm, âm thanh rất buồn vang trong đêm vắng, trên sân ga đầy
tuyết lạnh, nhưng gắn kết một nhịp, thành một sự thống nhất trong sự
bình tĩnh của những người lính Nga.
Sau này đọc nhiều tài liệu, lại quen thân một bác sĩ trong quân đội Nga
ở thị xã Stahnsdorf, tôi được biết, lính Nga được xác định rất rõ, tính
kỷ luật để giữ sao không mắc mưu những hành vi quá khích, nếu xảy ra ở
đường phố, bên doanh trại, nhất là những trạm nhỏ, từ phía người Đức
trẻ, nhằm bảo vệ quan hệ hai quốc gia ổn thỏa, dành quyền ngoại giao cho
các nhà nước, dẫn tới sau này những thỏa ước để người Nga, người Mỹ và
Pháp rút về nước. Rõ ràng tốp lính Nga kia dù không có sĩ quan chỉ huy
vẫn có tính kỷ luật rất cao.
Nước Đức năm ấy đã trải qua một biến động chính trị rất lớn, nó trở
thành một quốc gia thống nhất và mạnh tới hôm nay, lại tránh cho toàn
thế giới một cuộc đối đầu nguy niểm, là có sự đóng góp xây dựng chính ở
tinh thần công dân Đức rất hiểu biết, rất trọng kỷ luật. Những người
lính Nga cũng như thế, họ là những người lính có kỷ luật.
Tôi đã ở quân đội 11 năm, thực sự thấy quân đội nhân dân Việt Nam là
quân đội từ nhân dân mà ra và rất có kỷ luật. Chính điều đó làm nên sức
mạnh của đội quân mà làm nên chiến thắng được những kẻ địch thường chiếm
ưu thế về hỏa lực.
Tình hình đất nước những ngày qua đang sôi lên vì nhà nước Trung Quốc đặt giàn khoan lên biển Đông của nước ta. Nhân dân ta ở khắp nơi đã thể hiện lòng yêu nước, tự tổ chức những cuộc biểu tình ở nhiều nơi để tỏ rõ thái độ của mình, phản đối việc nhà nước Trung Quốc xâm phạm chủ quyền biển đảo của nước Việt Nam chúng ta. Hơn lúc nào hết, đất nước cần trách nhiệm công dân, sự hiểu biết của mỗi công dân trong trách nhiệm với đất nước, là tinh thần kỷ luật cao như những chiến sĩ ngoài mặt trận, là ôn hòa đấu tranh, giữ đúng một thái độ: Không khoan nhượng với hành vi xâm phạm chủ quyền của Trung Quốc trên biển Đông với giàn khoan Hải Dương 981, nhưng không có những hành vi tự phát, thiếu suy nghĩ, dẫn tới các hành vi có tính phá hoại tài sản của các tập đoàn kinh tế (bất luận tập đoàn kinh tế ấy là nước nào, đều nằm trong sự bảo trợ của luật pháp của nước Việt Nam chúng ta), đang đầu tư trong nước ta gây ảnh hưởng không nhỏ về uy tín của nước ta trên trường quốc tế...
Tình hình đất nước những ngày qua đang sôi lên vì nhà nước Trung Quốc đặt giàn khoan lên biển Đông của nước ta. Nhân dân ta ở khắp nơi đã thể hiện lòng yêu nước, tự tổ chức những cuộc biểu tình ở nhiều nơi để tỏ rõ thái độ của mình, phản đối việc nhà nước Trung Quốc xâm phạm chủ quyền biển đảo của nước Việt Nam chúng ta. Hơn lúc nào hết, đất nước cần trách nhiệm công dân, sự hiểu biết của mỗi công dân trong trách nhiệm với đất nước, là tinh thần kỷ luật cao như những chiến sĩ ngoài mặt trận, là ôn hòa đấu tranh, giữ đúng một thái độ: Không khoan nhượng với hành vi xâm phạm chủ quyền của Trung Quốc trên biển Đông với giàn khoan Hải Dương 981, nhưng không có những hành vi tự phát, thiếu suy nghĩ, dẫn tới các hành vi có tính phá hoại tài sản của các tập đoàn kinh tế (bất luận tập đoàn kinh tế ấy là nước nào, đều nằm trong sự bảo trợ của luật pháp của nước Việt Nam chúng ta), đang đầu tư trong nước ta gây ảnh hưởng không nhỏ về uy tín của nước ta trên trường quốc tế...
Khó có sự tập trung sức mạnh thiếu một sự chỉ đạo thống nhất, nhất là
trong tình trạng manh mún và tự phát. Đã đến lúc các cuộc biểu tình cần
có kiểm soát, bằng sự kêu gọi, bằng ý kiến, sáng kiến của nhân sĩ trí
thức, nhân dân và dựa vào đội ngũ nhân sĩ, trí thức để có chủ trương và
sự phối hợp hành động công dân.
Tôi tin rằng, nếu tin dân, lại hiểu được dân, khi có sự tham gia lãnh
đạo của mặt trận Tổ quốc, các đoàn thể, các các cấp chính quyền, nhất là
ở từng địa phương xa trung ương, thì nhà nước ta sẽ có sức mạnh dân
tộc, mang lại hiệu quả cao cho sự bảo đảm tính ôn hòa, có văn hóa ứng xử
trong đấu tranh vì hòa bình và ổn định kinh tế và chính trị của đất
nước Việt Nam...
Nguyễn Văn Thọ
May 9, 2014
Java exception handling best practices
This post is another addition in best practices
series available in this blog. In this post, I am covering some
well-known and some little known practices which you must consider while
handling exceptions in your next java programming assignment. Follow
this link to read more about exception handling in java.
Checked exceptions are exceptions that must be
declared in the throws clause of a method. They extend Exception and are
intended to be an “in your face” type of exceptions. Java wants you to
handle them because they somehow are dependent on external factors
outside your program. A checked exception indicates an expected problem
that can occur during normal system operation. Mostly these exception
happen when you try to use external systems over network or in file
system. Mostly, the correct response to a checked exception should be to
try again later, or to prompt the user to modify his input.
Unchecked exceptions are exceptions that do not need to be declared in a throws clause. JVM simply doesn’t force you to handle them as they are mostly generated at runtime due to programmatic errors. They extend RuntimeException. The most common example is a NullPointerException [Quite scary.. Isn't it?]. An unchecked exception probably shouldn’t be retried, and the correct action should be usually to do nothing, and let it come out of your method and through the execution stack. At a high level of execution, this type of exceptions should be logged.
Errors are serious runtime environment problems that are almost certainly not recoverable. Some examples are OutOfMemoryError, LinkageError, and StackOverflowError. They generally crash you program or part of program. Only a good logging practice will help you in determining the exact causes of errors.
1) Either directly throw the custom exception when something goes wrong in application
Now lets start exploring the best practices followed for exception handling industry wise.
Doing this not only return “null” instead of handling or re-throwing
the exception, it totally swallows the exception, losing the cause of
error forever. And when you don’t know the reason of failure, how you
would prevent it in future? Never do this !!
2) Declare the specific checked exceptions that your method can throw
Always avoid doing this as in above code sample. It simply defeats
the whole purpose of having checked exception. Declare the specific
checked exceptions that your method can throw. If there are just too
many such checked exceptions, you should probably wrap them in your own
exception and add information to in exception message. You can also
consider code refactoring also if possible.
3) Do not catch the Exception class rather catch specific sub classes
The problem with catching Exception is that if the method you are
calling later adds a new checked exception to its method signature, the
developer’s intent is that you should handle the specific new exception.
If your code just catches Exception (or Throwable), you’ll never know
about the change and the fact that your code is now wrong and might
break at any point of time in runtime.
4) Never catch Throwable class
Well, its one step more serious trouble. Because java errors are also subclasses of the Throwable. Errors are irreversible conditions that can not be handled by JVM itself. And for some JVM implementations, JVM might not actually even invoke your catch clause on an Error.
5) Always correctly wrap the exceptions in custom exceptions so that stack trace is not lost
This destroys the stack trace of the original exception, and is always wrong. The correct way of doing this is:
6) Either log the exception or throw it but never do the both
As in above example code, logging and throwing will result in
multiple log messages in log files, for a single problem in the code,
and makes life hell for the engineer who is trying to dig through the
logs.
7) Never throw any exception from finally block
This is fine, as long as cleanUp() can never throw any exception. In
the above example, if someMethod() throws an exception, and in the
finally block also, cleanUp() throws an exception, that second exception
will come out of method and the original first exception (correct
reason) will be lost forever. If the code that you call in a finally
block can possibly throw an exception, make sure that you either handle
it, or log it. Never let it come out of the finally block.
8) Always catch only those exceptions that you can actually handle
Well this is most important concept. Don’t catch any exception just
for the sake of catching it. Catch any exception only if you want to
handle it or, you want to provide additional contextual information in
that exception. If you can’t handle it in catch block, then best advice
is just don’t catch it only to re-throw it.
9) Don’t use printStackTrace() statement or similar methods
Never leave printStackTrace() after finishing your code. Chances are one of your fellow colleague will get one of those stack traces eventually, and have exactly zero knowledge as to what to do with it because it will not have any contextual information appended to it.
10) Use finally blocks instead of catch blocks if you are not going to handle exception
This is also a good practice. If inside your method you are accessing
some method 2, and method 2 throw some exception which you do not want
to handle in method 1, but still want some cleanup in case exception
occur, then do this cleanup in finally block. Do not use catch block.
11) Remember “Throw early catch late” principle
This is probably the most famous principle about Exception handling. It basically says that you should throw an exception as soon as you can, and catch it late as much as possible. You should wait until you have all the information to handle it properly.
This principle implicitly says that you will be more likely to throw it in the low-level methods, where you will be checking if single values are null or not appropriate. And you will be making the exception climb the stack trace for quite several levels until you reach a sufficient level of abstraction to be able to handle the problem.
12) Always clean up after handling the exception
If you are using resources like database connections or network connections, make sure you clean them up. If the API you are invoking uses only unchecked exceptions, you should still clean up resources after use, with try – finally blocks. Inside try block access the resource and inside finally close the resource. Even if any exception occur in accessing the resource, then also resource will be closed gracefully.
13) Throw only relevant exception from a method
Relevancy is important to keep application clean. A method which tries to read a file; if throws NullPointerException then it will not give any relevant information to user. Instead it will be better if such exception is wrapped inside custom exception e.g. NoSuchFileFoundException then it will be more useful for users of that method.
14) Never use exceptions for flow control in your program
We have read it many times but sometimes we keep seeing code in our project where developer tries to use exceptions for application logic. Never do that. It makes code hard to read, understand and ugly.
15) Validate user input to catch adverse conditions very early in request processing
Always validate user input in very early stage, even before it reached to actual controller. It will help you to minimize the exception handling code in your core application logic. It also helps you in making application consistent if there is some error in user input.
For example: If in user registration application, you are following below logic:
1) Validate User
2) Insert User
3) Validate address
4) Insert address
5) If problem the Rollback everything
This is very incorrect approach. It can leave you database in inconsistent state in various scenarios. Rather validate everything in first place and then take the user data in dao layer and make DB updates. Correct approach is:
1) Validate User
2) Validate address
3) Insert User
4) Insert address
5) If problem the Rollback everything
16) Always include all information about an exception in single log message
LOGGER.debug(“Using cache sector A”);
LOGGER.debug(“Using retry sector B”);
Don’t do this.
Using a multi-line log message with multiple calls to LOGGER.debug() may look fine in your test case, but when it shows up in the log file of an app server with 400 threads running in parallel, all dumping information to the same log file, your two log messages may end up spaced out 1000 lines apart in the log file, even though they occur on subsequent lines in your code.
Do it like this:
LOGGER.debug(“Using cache sector A, using retry sector B”);
17) Pass all relevant information to exceptions to make them informative as much as possible
This is also very important to make exception messages and stack traces useful and informative. What is the use of a log, if you are not able to determine anything out of it. These type of logs just exist in your code for decoration purpose.
18) Always terminate the thread which it is interrupted
InterruptedException is a clue to your code that it should stop
whatever it’s doing. Some common use cases for a thread getting
interrupted are the active transaction timing out, or a thread pool
getting shut down. Instead of ignoring the InterruptedException, your
code should do its best to finish up what it’s doing, and finish the
current thread of execution. So to correct the example above:
19) Use template methods for repeated try-catch
There is no use of having a similar catch block in 100 places in your code. It increases code duplicity which does not help anything. Use template methods for such cases.
For example below code tries to close a database connection.
This type of method will be used in thousands of places in your
application. Don’t put whole code in every place rather define above
method and use it everywhere like below:
20) Document all exceptions in your application in javadoc
Make it a practice to javadoc all exceptions which a piece of code may throw at runtime. Also try to include possible course of action, user should follow in case these exception occur.
That’s all i have in my mind for now. If you found anything missing or you does not relate to my view on any point, drop me a comment. I will be happy to discuss.
Sections in this post Type of exceptions User defined custom exceptions Best practices you must consider and follow Never swallow the exception in catch block Declare the specific checked exceptions that your method can throw Do not catch the Exception class rather catch specific sub classes Never catch Throwable class Always correctly wrap the exceptions in custom exceptions so that stack trace is not lost Either log the exception or throw it but never do the both Never throw any exception from finally block Always catch only those exceptions that you can actually handle Don't use printStackTrace() statement or similar methods Use finally blocks instead of catch blocks if you are not going to handle exception Remember "Throw early catch late" principle Always clean up after handling the exception Throw only relevant exception from a method Never use exceptions for flow control in your program Validate user input to catch adverse conditions very early in request processing Always include all information about an exception in single log message Pass all relevant information to exceptions to make them informative as much as possible Always terminate the thread which it is interrupted Use template methods for repeated try-catch Document all exceptions in your application in javadocBefore we dive into deep concepts of exception handling best practices, lets start with one of the most important concepts which is to understand that there are three general types of throwable classes in Java: checked exceptions, unchecked exceptions, and errors.
Type of exceptions
Unchecked exceptions are exceptions that do not need to be declared in a throws clause. JVM simply doesn’t force you to handle them as they are mostly generated at runtime due to programmatic errors. They extend RuntimeException. The most common example is a NullPointerException [Quite scary.. Isn't it?]. An unchecked exception probably shouldn’t be retried, and the correct action should be usually to do nothing, and let it come out of your method and through the execution stack. At a high level of execution, this type of exceptions should be logged.
Errors are serious runtime environment problems that are almost certainly not recoverable. Some examples are OutOfMemoryError, LinkageError, and StackOverflowError. They generally crash you program or part of program. Only a good logging practice will help you in determining the exact causes of errors.
User defined custom exceptions
Anytime when user feels that he wants to use its own application specific exception for some reasons, he can create a new class extending appropriate super class (mostly its Exception.java) and start using it in appropriate places. These user defined exceptions can be used in two ways:1) Either directly throw the custom exception when something goes wrong in application
throw new DaoObjectNotFoundException("Couldn't find dao with id " + id);2) Or wrap the original exception inside custom exception and throw it
catch (NoSuchMethodException e) { throw new DaoObjectNotFoundException("Couldn't find dao with id " + id, e); }Wrapping an exception can provide extra information to the user by adding your own message/ context information, while still preserving the stack trace and message of the original exception. It also allows you to hide the implementation details of your code, which is the most important reason to wrap exceptions.
Now lets start exploring the best practices followed for exception handling industry wise.
Best practices you must consider and follow
1) Never swallow the exception in catch block1.
catch
(NoSuchMethodException e) {
2.
return
null
;
3.
}
2) Declare the specific checked exceptions that your method can throw
1.
public
void
foo()
throws
Exception {
//Incorrect way
2.
}
1.
public
void
foo()
throws
SpecificException1, SpecificException2 {
//Correct way
2.
}
1.
try
{
2.
someMethod();
3.
}
catch
(Exception e) {
4.
LOGGER.error(
"method has failed"
, e);
5.
}
4) Never catch Throwable class
Well, its one step more serious trouble. Because java errors are also subclasses of the Throwable. Errors are irreversible conditions that can not be handled by JVM itself. And for some JVM implementations, JVM might not actually even invoke your catch clause on an Error.
5) Always correctly wrap the exceptions in custom exceptions so that stack trace is not lost
1.
catch
(NoSuchMethodException e) {
2.
throw
new
MyServiceException(
"Some information: "
+ e.getMessage());
//Incorrect way
3.
}
1.
catch
(NoSuchMethodException e) {
2.
throw
new
MyServiceException(
"Some information: "
, e);
//Correct way
3.
}
1.
catch
(NoSuchMethodException e) {
2.
LOGGER.error(
"Some information"
, e);
3.
throw
e;
4.
}
7) Never throw any exception from finally block
1.
try
{
2.
someMethod();
//Throws exceptionOne
3.
}
finally
{
4.
cleanUp();
//If finally also threw any exception the exceptionOne will be lost forever
5.
}
8) Always catch only those exceptions that you can actually handle
1.
catch
(NoSuchMethodException e) {
2.
throw
e;
//Avoid this as it doesn't help anything
3.
}
9) Don’t use printStackTrace() statement or similar methods
Never leave printStackTrace() after finishing your code. Chances are one of your fellow colleague will get one of those stack traces eventually, and have exactly zero knowledge as to what to do with it because it will not have any contextual information appended to it.
10) Use finally blocks instead of catch blocks if you are not going to handle exception
1.
try
{
2.
someMethod();
//Method 2
3.
}
finally
{
4.
cleanUp();
//do cleanup here
5.
}
11) Remember “Throw early catch late” principle
This is probably the most famous principle about Exception handling. It basically says that you should throw an exception as soon as you can, and catch it late as much as possible. You should wait until you have all the information to handle it properly.
This principle implicitly says that you will be more likely to throw it in the low-level methods, where you will be checking if single values are null or not appropriate. And you will be making the exception climb the stack trace for quite several levels until you reach a sufficient level of abstraction to be able to handle the problem.
12) Always clean up after handling the exception
If you are using resources like database connections or network connections, make sure you clean them up. If the API you are invoking uses only unchecked exceptions, you should still clean up resources after use, with try – finally blocks. Inside try block access the resource and inside finally close the resource. Even if any exception occur in accessing the resource, then also resource will be closed gracefully.
13) Throw only relevant exception from a method
Relevancy is important to keep application clean. A method which tries to read a file; if throws NullPointerException then it will not give any relevant information to user. Instead it will be better if such exception is wrapped inside custom exception e.g. NoSuchFileFoundException then it will be more useful for users of that method.
14) Never use exceptions for flow control in your program
We have read it many times but sometimes we keep seeing code in our project where developer tries to use exceptions for application logic. Never do that. It makes code hard to read, understand and ugly.
15) Validate user input to catch adverse conditions very early in request processing
Always validate user input in very early stage, even before it reached to actual controller. It will help you to minimize the exception handling code in your core application logic. It also helps you in making application consistent if there is some error in user input.
For example: If in user registration application, you are following below logic:
1) Validate User
2) Insert User
3) Validate address
4) Insert address
5) If problem the Rollback everything
This is very incorrect approach. It can leave you database in inconsistent state in various scenarios. Rather validate everything in first place and then take the user data in dao layer and make DB updates. Correct approach is:
1) Validate User
2) Validate address
3) Insert User
4) Insert address
5) If problem the Rollback everything
16) Always include all information about an exception in single log message
LOGGER.debug(“Using cache sector A”);
LOGGER.debug(“Using retry sector B”);
Don’t do this.
Using a multi-line log message with multiple calls to LOGGER.debug() may look fine in your test case, but when it shows up in the log file of an app server with 400 threads running in parallel, all dumping information to the same log file, your two log messages may end up spaced out 1000 lines apart in the log file, even though they occur on subsequent lines in your code.
Do it like this:
LOGGER.debug(“Using cache sector A, using retry sector B”);
17) Pass all relevant information to exceptions to make them informative as much as possible
This is also very important to make exception messages and stack traces useful and informative. What is the use of a log, if you are not able to determine anything out of it. These type of logs just exist in your code for decoration purpose.
18) Always terminate the thread which it is interrupted
1.
while
(
true
) {
2.
try
{
3.
Thread.sleep(
100000
);
4.
}
catch
(InterruptedException e) {}
//Don't do this
5.
doSomethingCool();
6.
}
1.
while
(
true
) {
2.
try
{
3.
Thread.sleep(
100000
);
4.
}
catch
(InterruptedException e) {
5.
break
;
6.
}
7.
}
8.
doSomethingCool();
There is no use of having a similar catch block in 100 places in your code. It increases code duplicity which does not help anything. Use template methods for such cases.
For example below code tries to close a database connection.
01.
class
DBUtil{
02.
public
static
void
closeConnection(Connection conn){
03.
try
{
04.
conn.close();
05.
}
catch
(SQLException ex){
06.
throw
new
RuntimeException(
"Cannot close connection"
, ex);
07.
}
08.
}
09.
}
01.
public
void
dataAccessCode() {
02.
Connection conn =
null
;
03.
try
{
04.
conn = getConnection();
05.
....
06.
}
finally
{
07.
DBUtil.closeConnection(conn);
08.
}
09.
}
Make it a practice to javadoc all exceptions which a piece of code may throw at runtime. Also try to include possible course of action, user should follow in case these exception occur.
That’s all i have in my mind for now. If you found anything missing or you does not relate to my view on any point, drop me a comment. I will be happy to discuss.
(Source: Internet)
Subscribe to:
Posts (Atom)