{Help}Bài tập multiThread

phanduy2691

New Member
3/3/12
5
0
1
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
 

whiterose713

New Member
20/3/12
17
6
3
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();
    }
}
 

sinhngay10thang9

New Member
16/2/12
5
3
3
@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 (c = 2; c <=Math.sqrt(i); c++) {
            if (i % c == 0) {
                return false;
            }
        }
        return true;
    }
 
  • Like
Reactions: whiterose713

huyit88

New Member
24/5/12
26
5
3
32
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 <=.
 
26/4/13
88
24
8
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
 
  • Like
Reactions: SITUVN

SITUVN

Well-Known Member
25/2/12
965
262
63
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 :|.
 

Trường Đăng

New Member
14/12/19
1
0
1
20
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.
 

Joe

Thành viên VIP
21/1/13
2,969
1,310
113
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.
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.
 
  • Like
Reactions: Trường Đăng

quydtkt

Administrator
1/11/19
389
38
28
27
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.
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
 
  • Like
Reactions: Trường Đăng