Java concurrency (multi-threading)

1. ExecutorService

ExecutorService là một framework sinh ra với mục đích đơn giản hóa việc thực thi các task theo cơ chế bất đồng bộ. Về cơ bản ExecutorService tự động khởi tạo thread pool và cung cấp các API cho phép developer assigning task tới pool.

ExecutorService không tự động destroyed khi không có task nào thực thi. Nó sẽ alivewait for new work. Điều này cũng hữu ích trong một số trường hợp khi số lượng task là không cố định và không biết trước tại thời điểm compile. VD: 1 program SocketServer.

Trong các trường hợp khác sẽ không thể kiểm soát khi chương trình đã thực thi xong nhiệm vụ nhưng không thể dừng lại chỉ bởi ExecutorService  vẫn alive và tiếp tục wait for new work. Để tránh trường hợp này java cung cấp 2 API là shutdown() và shutdownNow()

shutDown() sẽ dừng việc tiếp nhận các task mới và shut down hoàn toàn sau khi những submitted task được thực thi.

shutdownNow() sẽ ngay lập tức destroy ExecutorService và trả lại danh sách các task đang đợi để thực thi. Developer cần quyết định sẽ làm gì với những task này.

Oracle khuyến cáo sử dụng cả 2 phương thức shutdown của ExecutorService. Sử dụng shutdown() trước để vô hiệu hóa việc tiếp nhận các task mới. Đợi trong 1 khoảng thời gian nhất định để toàn bộ các task được thực thi. Sau quãng thời gian này thực hiện lệnh shutdownNow()

 void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // Disable new tasks from being submitted
   try {
     // Wait a while for existing tasks to terminate
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow(); // Cancel currently executing tasks
       // Wait a while for tasks to respond to being cancelled
       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
           System.err.println("Pool did not terminate");
     }
   } catch (InterruptedException ie) {
     // (Re-)Cancel if current thread also interrupted
     pool.shutdownNow();
     // Preserve interrupt status
     Thread.currentThread().interrupt();
   }
 }

awaitTermination(long timeout, TimeUnit unit) sẽ block thread cho đến khi toàn bộ task được thực thi sau lệnh shutdown()  hoặc khi hết thời gian đã định trước.

2. Futures and Callables

Trong trường hợp thread cần trả về 1 kết quả chúng ta cần implement interface  java.util.concurrent.Callable. Callable object cho phép trả về một giá trị sau khi task hoàn thành.  Sau khi submit object Callable tới ExecutorService sẽ nhận lại một object type java.util.concurrent.Future cho phép chờ lấy kết quả hoặc kiểm tra trạng thái thực thi task.

Callable<Long> task = new SampleCallable();
    Future<Long> result = executorService.submit(task);

    // A special blocking method
    // Calling the get() method while the task is still running will
    // cause execution to block until the task is properly executed and
    // the result is available.
    logger.debug("Result {}", result.get());
}
Advertisements

JVM Ecosystem Report 2018

Công ty Snyk và Java Magazine vừa mới công bố bản báo cáo về JVM Ecosystem. Hơn 10k developer từ khắp nơi trên thế giới đã tham gia khảo sát. Có rất nhiều điều thú vị trong bản report này.  Chi tiết của report có thể download tại đây

1. Which Java vendor’s JDK do you use in production for your main applications?

2018-10-18-14-00-snyk.io

Dễ hiểu khi có tới 70% developers lựa chọn Oracle JDK tuy nhiên điều này có thể sẽ thay đổi trong tương lai khi Oracle chính thức yêu cầu commercial license để sử dụng Java SE

6. Which IDE do you develop with?

ide-popularity-intellij-idea-eclipse-netbeans

Có thể thấy sự hiện diện của Visual Studio Code ở đây mặc dù chỉ 1%. Hơi bất ngờ khi vẫn còn tới 3% developer sử dụng vi/vim/Emacs/etc để làm việc. Mình có dùng notepad để coding một thời gian hồi còn đi học. Đúng là một ác mộng

9. Do you use static security tools in your testing?

do-you-use-static-security-tools-in-your-testing_-1

72% developers không sử dụng security tools khi kiểm thử. Có lẽ Synk không thích điều này :).  Snyk.io là công ty về network security, phát triển các công cụ chịu trách nhiệm giám sát, phát hiện sớm các lỗ hổng từ những dependencies mà developer sử dụng trong project.

10. Which CI server do you use?

ci-tool-popularity-jenkins-bamboo-teamcity

Continuous integration gần như đã trở thành tiêu chuẩn trong phát triển phần mềm. Việc tích hợp CI cũng đã dễ dàng hơn rất nhiều tuy nhiên vẫn có đến 21% developers không sử dụng CI trong dự án.

12. Which code repository do you use for your main project?

code-repository-popularity-github-bitbucket-gitlab

Trái với suy nghĩ của mình Github không dẫn đầu thị phần repository hosting service. Không rõ việc Microsft mua lại Github có ảnh hưởng đến quyết định sử dụng repository của developer không?

30. How old are you?

how-old-are-you

 

Garmin activities comapre

Mình vừa phát hiện ra Garmin cho phép comapre 2 activities cùng loại với nhau.

Điều này khá thú vị khi bạn muốn kiểm tra lại thành tích ở lần chạy trước đó để coi khả năng mình đang tiến bộ hay thụt lùi 🙂 . Rất tiếc là hiện tại chỉ hỗ trợ compare tối đa 4 hoạt động cùng loại. Nếu Garmin có thể tự động xuất báo cáo dạng biểu đồ của tất cả hoạt động thì sẽ tốt hơn rất nhiều.

Mình vừa chén xong 2 buổi long run vào 2 cuối tuần vừa rồi. Có vẻ mọi thứ đang dần trở lại, mình chủ động nghỉ sau hơn 1 giờ để giữ chân. Thời gian sau chấn thương mình duy trì lịch tập với 1 buổi leg strength và 1 long run. Tuần này mình sẽ bổ sung thêm 1 buổi interval nữa. Như vậy 1 tuần sẽ có 2 buổi chạy, nếu mọi thứ ok mình sẽ thêm vào 1 buổi easy run vào giữa tuần.

 

Hồi phục… IT Band

Cuối tuần vừa rồi mình đã có 2 buổi chạy bộ liên tiếp ngay gần nhà. Mình chủ động tính toán thời gian để buổi chạy không vượt quá 1 giờ. Chấn thương khiến mình cẩn trọng trong từng bước chạy, cảm nhận trọng lực dồn đều từ bàn chân lên cơ tứ đầu, hamstring.

Mình cảm nhận được rõ điều này vì toàn bộ các nhóm cơ chân tới mông của mình vẫn còn khá căng cứng. Hậu quả của Leg day từ hôm thứ 4 tuần trước, đáng lẽ mình không nên chạy bộ vào cuối tuần này tuy nhiên mình vẫn quyết định xỏ giầy. “Mình đã nghỉ 1 tuần rồi. Cùng lắm đau 1 chút sẽ nghỉ 1 tuần nữa”, mình đã nghĩ vậy.

Hôm nay là ngày thứ 2 sau buổi chạy chân cẳng mình vẫn ổn. Có vẻ đầu gối của mình đã dần ổn định trở lại :). Để nói về cái việc này có ý nghĩa như thế nào thì phải quay trở lại buổi chạy 1 tuần trước. Mình bị đau IT band ngay sau 2 bài chạy nhỏ (20phút/bài) và tuần trước nữa đó thì mình không thể chạy nổi 3km mặc dù đã lê lết ở pace 8:50-9.

Cái chấn thương IT Band này đã đeo đẳng với mình suốt từ tháng 8 đến giờ.  Để chuẩn bị cho Tràng An Marathon mình đã tăng số buổi chạy trong tuần lên từ tháng 7. Giữa tuần có 1 buổi Interval, cuối tuần là Long run. Có điều vì lười dậy sớm ra công viên nên mình đã tập Interval trên treatmill tại phòng gym. Chạy trên treadmill mình không thể đẩy tốc độ lên cao ngay lập tức, nguyên tắc an toàn treadmill là sau khi tăng speed thì tốc độ của máy mới được đẩy lên sau vài giây. Do vậy mà nhịp chạy nhanh của mình chỉ ở mức bình thường, hear rate trung bình loanh quanh ở cuối zone 3.  Kết quả cải thiện đáng kể, ở buổi Long run cuối tuần mình chạy khá ổn và mình quyết định tăng pace vào mỗi buổi Long run cuối tuần. Cần phải nói thêm là mình vẫn duy trì Leg day mỗi tuần ở phòng Gym. Nghĩ lại giai đoạn này đôi chân của mình bị hành hạ tương đối với mỗi tuần 2 buổi chạy treadmill + 1 buổi full leg + 1 long run vào cuối tuần.

Và kết quả là chấn thương ập đến.