Announcement

Collapse
No announcement yet.

multithread java

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • multithread java

    Viết chương trình tạo 2 tuyến: một tuyến tìm kiếm các số nguyên tố từ 1000 đến 1000000 và một tuyến tính tổng giá trị của các số nguyên tố tìm được. Chú ý đồng bộ tuyến. Có ai bít thì chỉ giúp, mình code hoài mà ko ra

  • #2
    Originally posted by 09520682 View Post
    Viết chương trình tạo 2 tuyến: một tuyến tìm kiếm các số nguyên tố từ 1000 đến 1000000 và một tuyến tính tổng giá trị của các số nguyên tố tìm được. Chú ý đồng bộ tuyến. Có ai bít thì chỉ giúp, mình code hoài mà ko ra
    http://docs.oracle.com/javase/tutori...l/concurrency/
    Amat Victoria Curam.

    ------
    Ping me at me@toan.mobi

    Comment


    • #3
      sử dụng 2 thread, 1 thread dùng để tìm số nguyên tố (chạy trong hàm main cũng đc), 1 thread dùng để tính tổng và in kết quả ra màn hình sau mỗi lần tìm được 1 số nguyên tố (in số nguyên tố và kết quả tính được đến thời điểm số nguyên tố đó được tìm thấy)
      đồng bộ hóa thì có trong slide của thầy rồi, chú ý là trong slide thì người ta sử dụng lệnh wait() để chờ việc đọc/ghi buffer... nhưng nếu ta sử dụng lại thì sẽ dẫn đến việc chờ có thể rất lâu => hiệu suất không đảm bảo... nên ta nên set thời gian chờ cho lệnh wait là khoảng 5ms.
      Còn hơn nhau là code xác định số nguyên tố của mỗi người! bài này thầy không yêu cầu quá cao về thuật toán nên chỉ cần chạy nhanh và ổn định là được!
      University of Information Technology - Faculty of Computer Engineering
      [ E ] 09520401@gm.uit.edu.vn || dangdx.es@gmail.com
      [ F ] https://www.fb.com/dangdao261
      :happy:

      Comment


      • #4
        Originally posted by 09520401 View Post
        sử dụng 2 thread, 1 thread dùng để tìm số nguyên tố (chạy trong hàm main cũng đc), 1 thread dùng để tính tổng và in kết quả ra màn hình sau mỗi lần tìm được 1 số nguyên tố (in số nguyên tố và kết quả tính được đến thời điểm số nguyên tố đó được tìm thấy)
        đồng bộ hóa thì có trong slide của thầy rồi, chú ý là trong slide thì người ta sử dụng lệnh wait() để chờ việc đọc/ghi buffer... nhưng nếu ta sử dụng lại thì sẽ dẫn đến việc chờ có thể rất lâu => hiệu suất không đảm bảo... nên ta nên set thời gian chờ cho lệnh wait là khoảng 5ms.
        Còn hơn nhau là code xác định số nguyên tố của mỗi người! bài này thầy không yêu cầu quá cao về thuật toán nên chỉ cần chạy nhanh và ổn định là được!
        Thật thế hok? Tại sao lại kêu "chờ rất lâu" ? hiệu suất hok đảm bảo?

        Im a british accent lover

        Comment


        • #5
          Originally posted by 08520016 View Post
          Thật thế hok? Tại sao lại kêu "chờ rất lâu" ? hiệu suất hok đảm bảo?
          Lý do là em không dùng notify() @@!!!
          University of Information Technology - Faculty of Computer Engineering
          [ E ] 09520401@gm.uit.edu.vn || dangdx.es@gmail.com
          [ F ] https://www.fb.com/dangdao261
          :happy:

          Comment


          • #6
            Originally posted by 09520401 View Post
            Lý do là em không dùng notify() @@!!!
            Ơ, đã đồng bộ 2 thread mà wait mà không notify hay notifyAll thì đâu có còn là đồng bộ 2 thread .Thế nên câu trên của e là sai ui nhé.

            Im a british accent lover

            Comment


            • #7
              Em cũng nhận ra điều đó khi anh highlight comment của em!
              Nhưng em dùng một biến boolean và wait(5) thì nó vẫn đồng bộ được, có điều là hiệu suất giảm đi rất nhiều!
              University of Information Technology - Faculty of Computer Engineering
              [ E ] 09520401@gm.uit.edu.vn || dangdx.es@gmail.com
              [ F ] https://www.fb.com/dangdao261
              :happy:

              Comment


              • #8
                Code:
                public class Prime {
                		
                	private boolean syn = false;
                	private int prime;
                	private int time;
                	
                	public Prime(boolean syn, int time){
                		this.syn = syn;
                		this.time = time;
                	}
                	
                	public int getPrime(){
                		return prime;
                	}
                	
                	public static boolean isPrime(int x){
                		if(x < 2)
                			return false;
                		else if(x == 2)
                			return true;
                		for(int i = 2; i <= Math.sqrt((double)x); ++i)
                			if(x % i == 0)
                				return false;
                		return true;
                	}
                	
                	public synchronized void setPrime(int prime){
                		while(!syn){
                			try {
                				wait();
                			} catch (InterruptedException e) {
                				e.printStackTrace();
                			}
                		}
                		System.out.print("So nguyen to hien tai la: " + prime);
                		this.prime = prime;
                		syn = false;
                		notifyAll();
                	}
                	
                	public synchronized void showSum(long sum){
                		while(syn){
                			try {
                				wait();
                			} catch (InterruptedException e) {
                				e.printStackTrace();
                			}
                		}
                		System.out.print(" - Tong so nguyen to: " + (sum + prime) + "\r\n");
                		syn = true;
                		notifyAll();
                		try {
                			Thread.sleep(time);
                		} catch (InterruptedException e) {
                			e.printStackTrace();
                		}
                	}
                	
                }
                Cái class chính cho bài này mình viết ở trên, còn đưa vào hai cái thread như thế nào thì bạn tự làm nha!
                Mình có thể gợi ý theo cách của mình là:
                Thread tìm số nguyên tố sẽ chạy từ 1000 -> 1000000
                Thread tìm tổng sẽ chạy khi số nguyên tố hiện tại < 1000000 => nảy sinh vấn đề là nó sẽ không ngưng lại được do kết quả bên thread kia ngừng với số nguyên tố cuối cùng chắc chắn là < 1000000(nói đến đây thì chắc các bạn cũng biết làm cách nào để ngắt thread thứ 2 rồi)
                Bài này khá giống bài toán socola, chỉ khó hơn một tí
                Với bài sắp 2 mảng thì có vẻ phức tạp hơn tí, mình lười nên code buble sort với 1000000 phần tử thì hai thread chạy mỗi thread mất khoảng hơn 400s - với số random < 1000 và > -1000(cái này ngậm cười nơi chín suối vì ngồi đợi). Post lên mất mặt nên chỉ post bài này thôi!
                Hi vọng giúp được bạn, chúc bạn học tốt!

                Comment


                • #9
                  Mình thấy có một số chương trình sử dụng kết hợp: ThreadPoolExecutor, executors, CountDownLatch trong sử lý đa tiến trình và đồng bộ hoá. Các bạn xem thử có thể áp dụng mấy cái này trong trường hợp của mình không.

                  Comment


                  • #10
                    Các bác vào đây tham khảo này: http://congdongjava.com/forum/thread...ithread.14885/
                    https://fbcdn-photos-a.akamaihd.net/...08264688_a.jpg

                    Comment

                    LHQC

                    Collapse
                    Working...
                    X