Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

[Tutorial] Sử dụng Thread trong java

Discussion in 'Hướng dẫn người mới bắt đầu' started by kim, 26/8/12.

  1. green_river48

    green_river48 New Member

    Bài viết rất tốt. Để phát triển tiếp chủ đề này mình có 1 số ý kiến sau:
    - Giới thiệu về các trạng thái cơ bản của thread trong Java: new, runnable(ready, running), waiting, blocked, terminated....
    - Nên viết riêng 1 class MyTask implements Runnable --> new Thread(Runnable) --> mình thấy cách khởi tạo ntn tường minh hơn, phân biệt giữa task và thread, run() và start()
    - Sử dụng ExcutorService để tạo thread pool nhằm quản lý threads tốt hơn.
    - Cơ chế wait(), notify(), notifyAll()
    - Interface Lock, Condition --> theo mình thấy thì Lock-Conditon có nhiều ưu điểm hơn synchronized
    - Các thread-safe collections: Vector, HashTable, ArrayBlockingQueue....
    - Phương thức fork(), join()...
    Thân
     
  2. ThoaiNguyen

    ThoaiNguyen New Member

    Ở bài 1 ý beobot hỏi là tại sao các lần chạy trong vòng for ở 2 thread lại không xen kẽ mà lại chạy lại riêng mà? Theo ý mình là do thời gian chạy quá ngắn nên không xảy ra sự xen kẽ, nếu cho vòng for lặp nhiều lần hơn thì sẽ xảy ra

    PHP:
    public  void run()
        {
            for(
    int i=0;i<1000000;i++)
            {
              
    //Thread.sleep(1000);
              
    if(i%100000==0)
                  
    System.out.println(Thread.currentThread().getName()+i);
            }
            
    System.out.println("Da xong"+Thread.currentThread().getName());
        }
    Còn trong bài thứ 2 thì mình chưa hiểu lắm.Theo mình hiểu thì tài nguyên dùng chung ở đây là biến tĩnh salary mà? Tại sao phải tạo 2 thread từ 1 object mThread như dzay?
     
  3. thanhlikes09bkdn

    thanhlikes09bkdn Active Member

    Giả sử bài toán ATM ở trên: Nếu thông tin tài khoản được lưu trữ trong Database. Thì mỗi người dùng thuộc một record thì làm sao đồng bộ từng record nếu có người dùng tài khoản để cập nhật, thêm, sửa, xóa:D
     
  4. JackV

    JackV Administrator Staff Member

    Trong trường hợp có 2 người cập nhật thông tin tài khoản thì chúng ta sẽ thêm cột revision, tức là lần dữ liệu về lần cập nhật thứ bao nhiêu, ví dụ tài khoản có 500k sau lần cập nhật thứ 3, cả 2 người đều lấy dữ liệu để sửa thì khi người 1 commit sẽ đưa thông tin về bộ phận sử lý là tôi lấy dữ liệu của lần cập thứ 3 rút ra 300k trong tài khoản thì lúc đó tài khoản có thông tin là lần cập nhật cuối là lần thứ 4, tài khoản còn 200k, người 2 cập nhật về là tôi lấy dữ liệu từ lần cập nhật thứ 3 rút ra 100k, khi đó bất kể là rút ra bao nhiêu chúng ta sẽ trả về một exception là invalid lần cập nhật count thông báo là lần cập nhật mới nhất đã là lần thứ tư, nếu muốn thao tác phải truy vấn lại thông tin mới được thao tác, nếu không làm như vậy thì người 2 sẽ update dữ liệu đè lên dữ liệu của người 1 thì tài khoản lúc đó còn 400k tuy là đã rút 300k+100k, đó là cách mà SVN dùng để quản lý một file cho phép nhiều người chỉnh sửa.
     
  5. thanhlikes09bkdn

    thanhlikes09bkdn Active Member

    Thế có nghĩa là không dín dáng gì đến đồng bộ phải không AD?
     
  6. JackV

    JackV Administrator Staff Member

    Vừa rồi nói đồng bộ ở mức độ toàn vẹn dữ liệu từ phía database, đồng bộ nó rộng hơn, có thể bạn nói là dữ liệu ở hai nơi chẳng hạn, chính xác là bạn muốn nói đến điều gì, mô tả chi tiết nhé
     
  7. thanhlikes09bkdn

    thanhlikes09bkdn Active Member

    ý mình là tưởng tạo phương thức hoặc đối tượng đồng bộ ở phía ngôn ngữ lập trình java.
    Và giờ thì mình cũng hơi hiểu ý của bạn. Ý bạn có phải là sử dụng thêm một thuộc tính đánh dấu ở phía dữ liệu. Để dễ quản lý phiên làm việc của người dùng. Mình cũng thấy cách này cũng hay. Nên đang suy nghĩ theo hướng này!
     
  8. chetbom

    chetbom New Member

    Các bác cho em hỏi? Ví dụ em tạo một mảng n Thread. Khi em cho vòng For để gọi hàm start() để kích hoạt các Thread trong mảng. Thì các Thread này có chạy ngẫu nhiên không hay là Thread nào start() trước sẽ chạy trước ạ?
     
  9. đương nhiên Thread nào start() trước sẽ chạy trước
     
  10. Joe

    Joe Thành viên VIP

    NOPE! You err. It depends fully on the JVM scheduler !
     
  11. anh có thể nói cụ thể hơn ko?
     
  12. Joe

    Joe Thành viên VIP

  13. dacnghi68

    dacnghi68 New Member

    bài viết hay quá, chỉ tiếc là hình ảnh bị mất hết nên đọc không được.
     
  14. hitshootnum1

    hitshootnum1 New Member

    Mình có 1 số thắc mắc.
    -Làm thế nào để biết được 1 chương trình của mình có bao nhiêu luồng đang chạy ? ý mình là có phương thức nào có thể lấy ra các thread đang chạy không
    -
    Thread.sleep() khác gì sv Thread.currentThread.sleep() mặc dù mình thấy kq của nó như nhau.
     
  15. JackV

    JackV Administrator Staff Member

    Bạn thử viết một nested thread rồi gọi hay lệnh đó xem có giống nhau không nhé.
     
  16. hitshootnum1

    hitshootnum1 New Member

  17. THL

    THL New Member

    Không có hình, ko hiểu được. Anh admin ơi. Up dùm em mấy tấm hình trong bài viết này với!
    Cảm ơn admin nhiều!
     
  18. united99

    united99 New Member

    Sao hình ảnh không hiển thị được vậy mọi người, làm mình khó hình dung quá :(
     
  19. huynqktmt

    huynqktmt New Member

    admin ơi. sao mình không xem được ảnh trong bài viết của các bạn nhỉ. Mình ko thấy các bạn add code gì vô nữa @@.
     
  20. JackV

    JackV Administrator Staff Member

    Những hình ảnh đó thông qua một server mà hiện nó đang gặp vấn đề nên không truy cập được
     
  21. devtttq

    devtttq New Member

    Những bài viết chất lượng nhưng mà lâu rồi nên có một số pic bị mất rồi, nên khó theo dõi quá.
     
  22. Lưu Bị

    Lưu Bị New Member

    Bài viết rất hay và bổ ích, giúp mình cũng cố thêm kiến thức về đa tiến trình.
     

Chia sẻ trang này

Loading...