Posts

Quick sort in the short version

Image
Ref:  https://www.programcreek.com/2012/11/quicksort-array-in-java/ public class QuickSort {     public static void main(String[] args) {         int[] arr = {4, 5, 1, 2, 3, 3};         quickSort(arr, 0, arr.length-1);         System.out.println(Arrays.toString(arr));     }     public static void quickSort(int[] arr, int start, int end){         int partition = partition(arr, start, end);         if(partition-1>start) {             quickSort(arr, start, partition - 1);         }         if(partition+1<end) {             quickSort(arr, partition + 1, end);         }     }     public static int partition(int[] arr, int start, int end){         int pivot = arr[end];     ...

PLSQL Tutorial

https://www.dotnettricks.com/learn/sqlserver/difference-between-stored-procedure-and-function-in-sql-server http://index-of.co.uk/Database/Oracle%20Database/Oracle%20PL-SQL%20Programming,%206th%20Edition.pdf https://www.plsql.co/ 1. Khai báo biến tên_biến  kiểu_dữ_liệu  [default] [giá_trị_khởi_tạo] ví dụ: name varchar(20) default "Nguyen Huy Bo"; point number(10,2) default 22 ;       giá trị lớn nhất là   9999999999,99 PI constant double default 3.14; DECLARE    --global variable    a integer := 10;    b integer := 20;    c integer;    f real; BEGIN    c := a + b;    f := 70.0/3.0;    DECLARE       -- Local variables       num1 number := 195;       num2 number := 185;    BEGIN       -- code here    END; END; / IF THEN END IF; IF (a <= 20) THEN --...

TimerTask

Khi bạn cần phát triển một service chạy thực thi một công việc Cronjob theo thời gian, theo chu kì, delay 1 thời gian .... Lúc đó bạn có thể nghĩ ngay đến TimerTask là một core java class. Không cần API thư viện ngoài :-)

Thread.join()

Ví dụ trong main thread có khởi tạo và chạy 2 thread1 và thread2 nếu main thread gọi thread1.join() --> đồng nghĩa với việc main thread sẽ chạy tới câu lệnh Thread1.join() sau đó nó sẽ dừng lại và không chạy tiếp các câu lệnh bên dưới. Nó sẽ chờ cho Thread1 hoàn thành rồi nó mới chạy tiếp. Ví dụ thực tế cho dễ hiểu. Bạn cần in một chương trình tính Tích giai thừa từ 1 đến 100 và bạn có 2 người(2 CPU có khả năng tính toán) song song như vậy bạn sẽ lập một chương trình  Thread t1 tính tích 1-> 50 Thread t2 tính tích 51-> 100 Và sau khi tính song thì bạn sẽ in kết quả ra màn hình  t1.result * t2.result Nhưng vấn đề là nếu bạn start t1 và start t2 cùng một lúc thì chương trình sẽ chạy và in ra tích t1.result* t2.result ngay sau đó trong khi t1 và t2 vẫn đang tính toán vậy làm thế nào để in ra kết quả khi cả 2 tính toán xong ngay sau khi bạn gọi t1.start và t2.start bạn phải gọi t1.join() và t2.join() ngay sau đó. Điều đó có ng...

Runable vs Callable

Runable là một interface mà nó dùng cho viêc thực hiện một công việc mất nhiều thời gian phản hồi ngay lập tức Bạn sẽ không thể nhận kết quả là 1 giá trị khi thực hiện xong Runable Vậy việc lấy giá trị sau khi thời gian chạy như vậy thì làm thế nào??? Bạn hoàn toàn có thể dùng biến share giữa các luồng để check và lấy giá trị Với sự phức tạp việc quản lý task khi dùng chung biến share Java đã phát triển một interface Callable Callable chạy task ngầm như Runable nhưng nó hỗ trợ trả về dữ liệu sau khi thực hiện xong task do vậy chúng ta có thể truy cập giá trị dễ dàng vậy làm cách nào để lấy giá trị đó Chúng ta phải dùng một Class là Future để thực hiện việc lấy dữ liệu thông qua Future.get()  là phương thức để lấy dữ liệu, khi phương thức get() được thực hiện nó sẽ block luồng hiện tại và chờ đợi khi có dữ liệu trả về vậy điều gì nếu hàm get() bị timeout khi dữ liệu không trả về sau 1 thời gian -- Luồng sẽ bị timeout theo Vậy Completeable sẽ giải quyết được đi...

CGlib in java

http://jexp.ru/index.php/Java_Tutorial/Spring/MethodInterceptor https://javax0.wordpress.com/2016/01/20/java-dynamic-proxy/ Bạn đã từng nghĩ về AOP trong Spring Làm thế nào nó hoạt động được hoặc bạn từng nghĩ viết hàm loging cho method một class nào đó mà không cần sửa class đó hãy nghĩ tới CGlib ví dụ bạn có một class như bên dưới và có 2 methods public class PersonService {     public String sayHello(String name) {         return "Hello " + name;     }     public Integer lengthOfName(String name) {         return name.length();     } }

BeanGenerator and how to use it

Chúng ta có thể dễ dàng tạo ra một class POJO hay một Bean bằng cách lập trình động, động ở việc thêm thuộc tính cho nó, kiểu dữ liệu các thuộc tính, động ở việc set giá trị thuộc tính bằng cách gọi đúng tên theo quy ước lạc đà BeanGenerator beanGenerator = new BeanGenerator(); beanGenerator.addProperty("name", List.class); Object myBean = beanGenerator.create(); Method setter = myBean.getClass().getMethod("setName", List.class); List<String> list= new ArrayList<String>(); list.add("Bộ"); setter.invoke(myBean, list); Method getter = myBean.getClass().getMethod("getName"); System.out.println(getter.getDeclaringClass());