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

{Help}Bài tập multiThread

Discussion in 'Xây dựng ứng dụng desktop standalone' started by phanduy2691, 28/4/12.

  1. phanduy2691

    phanduy2691 New Member

    viết chương trình tạo ra 2 tuyến:một tuyến tìm số nguyên tố từ 1000 đến 1000000 và một tuyến tính tổng số giá trị tìm được.Chú ý dùng đồng bộ.
    Mong các pro chỉ giúp dùm em
     
  2. nguyen baby

    nguyen baby Member

    Bài này mình làm được. Đợi mình
     
  3. whiterose713

    whiterose713 New Member

    Mình làm đc rồi nè, Nhưng hơi dài, gồm 5 file: FindPrime.java, SumPrime.java, interface Buffer.java, SynchoronizedBuffer.java, và test file

    Code:
    package MultiThreading;
    
    public interface Buffer {
        public void set(int value) throws InterruptedException;
        public int get() throws InterruptedException;
        public void setTerminate(boolean terminate);
        public boolean isTerminate();
    }
    
    Code:
    package MultiThreading;
    
    public class SynchronizedBuffer implements Buffer {
    
        private int buffer = -1;
        private boolean finded = false;
        private boolean terminate = false;
    
        public synchronized void set(int value) throws InterruptedException {
            while (finded) {
                wait();
            }
            buffer = value;
            finded = true;
            notifyAll();
        }
    
        public synchronized int get() throws InterruptedException {
            if(isTerminate())
              Thread.interrupted();
            while (!finded) {
                wait();
            }
            finded = false;
            notifyAll();
            return buffer;
        }
    
        public boolean isTerminate() {
            return terminate;
        }
    
        public void setTerminate(boolean terminate) {
            this.terminate = terminate;
        }
    
    }
    
    Code:
    package MultiThreading;
    
    public class FindPrime implements Runnable {
    
        private final Buffer sharedLocation;
        private int i = 0;
    
        public FindPrime(Buffer shared) {
            sharedLocation = shared;
        }
    
        @Override
        public void run() {
            try {
                for (int n = 100; n < 1000; n++) {
    
                    if (isPrime(n)) {
                        sharedLocation.set(n);
                        System.out.printf("%5d  ", n);
                        if ((++i) % 10 == 0) {
                            System.out.println("");
                        }
                    }
                }
                sharedLocation.setTerminate(true);
                sharedLocation.set(0);
            } catch (InterruptedException exception) {
                exception.printStackTrace();
            }
        }
    
        public static boolean isPrime(int i) {
            int c;
            for (c = 2; c < i; c++) {
                if (i % c == 0) {
                    return false;
                }
            }
            return true;
        }
    }
    
    Code:
    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
    package MultiThreading;
    
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    /**
    * SumPrime.java (UTF-8)
    * Created on May 3, 2012
    * @author Nguyen Ngoc Linh
    */
    public class SumPrime implements Runnable {
    
        private final Buffer sharedLocation;
        private int sum = 0;
        private boolean FindPrimeTask = false;
    
        public SumPrime(Buffer shared) {
            sharedLocation = shared;
        }
    
        @Override
        public void run() {
            try {
    
                while (true) {
                    if (sharedLocation.isTerminate()) {
                        break;
                    }
                    System.out.print("."); // wait
                    sum += sharedLocation.get();
                }
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
    
            System.out.println("\n Sum Prime: " + sum);
        }
    }
    
    Code:
    package MultiThreading;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class SharedBufferTest {
        public static void main(String[] args) {
            ExecutorService app = Executors.newCachedThreadPool();
            Buffer sharedLocation = new SynchronizedBuffer();
            app.execute(new FindPrime(sharedLocation));
            app.execute(new SumPrime(sharedLocation));
            app.shutdown();
        }
    }
    
     
  4. phanduy2691

    phanduy2691 New Member

    tks ban nha!
     
  5. sinhngay10thang9

    sinhngay10thang9 New Member

    @whiterose713:Chào bạn,hàm isPrime trong class FindPrime bạn viết chưa được tối ưu,mình xin phép được sửa lại 1 chút :D
    PHP:
    public static boolean isPrime(int i) {
            
    int c;
            for (
    2<=Math.sqrt(i); c++) {
                if (
    == 0) {
                    return 
    false;
                }
            }
            return 
    true;
        }
     
    whiterose713 likes this.
  6. huyit88

    huyit88 New Member

    Mình xin góp ý thêm một vài vấn đề.
    - Theo mình nên tách 2 luồng thread, chạy riêng biệt với nhau mà không cần phải wait(). FindPrime cứ chạy riêng biệt và lưu vào một arraylist, còn SumPrime là một thread hoặt động riêng cứ cộng lại. Thread SumPrime sẽ stop khi isTeminate && listResult is last. Như vậy có thể cải thiện tốc độ lên rất nhiều và các thread sẽ riêng biệt hơn.
    - Còn về hàm isPrime mình xin góp í thêm chút
    Code:
    public static boolean isPrime(int i) {
            int c; int max = Math.sqrt(i) + 1;
            for (c = 2; c < max; c++) {
                if (i % c == 0) {
                    return false;
                }
            }
            return true;
        }
    như vậy tốc độ sẽ tăng lên đáng kể vì trong vòng for sẽ không phải tính lại nhiều : Math.sqrt(i) , và so sánh <=.
     
  7. em thấy làm như vậy không đúng ý nghĩa của thread, nó cứ như là find dc 1 số thì dừng, chờ cho cộng xong mới tìm tiếp, chẳng khác gì 1 thread
     
    SITUVN likes this.
  8. SITUVN

    SITUVN Well-Known Member

    Cái tuyến tính tổng đó chỉ bằng 1 dòng:
    PHP:
    sum += prime;
    Có lẽ bài này mục đích là học về đa tuyến. Nhưng nếu áp dụng thực tế cho nó thì đúng là thừa 1 tuyến :|.
     
  9. em mới làm xong, đáp án là 37550325896 đúng ko các anh ??
     
  10. Trường Đăng

    Trường Đăng New Member

    mọi người code giúp em bài này với ạ:
    Ứng dụng multithread trong bài toán sau : Đọc vào một ma trận A từ file và nhập vào một số k,
    sau đó dùng n thread để thực hiện tìm kiếm trên các ma trận này xem có bao nhiêu phần tử giống k.
    Mỗi lần tìm thấy phần tử giống k thì tăng biến chung number (khởi động là 0) lên 1.
     
  11. Joe

    Joe Thành viên VIP

    Too much words and I understand just a bit. It's easier and better for the viewers (like me) when you upload your "codes" than to describe you problem. No problem even your "codes" won't work.
     
    Trường Đăng likes this.
  12. quydtkt

    quydtkt Administrator

    Theo mình nghĩ thì nên tạo số thead bằng với số dòng của ma trận, mỗi thead sẽ tìm phần từ k trên 1 dòng
     
    Trường Đăng likes this.

Chia sẻ trang này

Loading...