我對java很陌生,并開始構建一個小程式來查找給定范圍內的素數。現在我嘗試實作多任務處理,例如將要檢查的數字分成應獨立檢查的 n 個部分。我想讓它盡可能靈活,所以我沒有在代碼中指定執行緒數,而是使用了一個提示變數。現在,代碼可以作業,但執行緒不能并行運行。
這里似乎有什么問題?
[...]
System.out.println("How many Threads shall be used?");
int b1 = scan.nextInt();
scan.close();
for (int i = 1; i <= b1; i ) {
long u = (q/b1)*(i-1);
long o = (q/b1)*i;
System.out.println("Thread " i " started.");
Thread t1 = new Thread(new thread1 (u, o, i));
t1.start();
}
class thread1 implements Runnable{
public thread1 (long a, long b, int c) {
//a= min. number, b = max. number, c=number of Thread
primefinder.findPrimes(b,a, c);
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}
uj5u.com熱心網友回復:
從 javadoc https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html:
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
您的邏輯必須在 run() 方法中。正是這個方法將被呼叫并在另一個執行緒上運行。使用您的實際代碼,您可以在 Runnable 的建構式中進行計算,該建構式在您的 for 回圈中呼叫,因此是順序的。
將您的計算移至運行方法將解決問題。
編輯:如果您難以將引數傳遞給您的計算代碼,您可以簡化為:
Thread t1 = new Thread(() -> findPrimes(u, o, i));
t1.start();
它做同樣的事情,在底層,它創建了一個匿名類來實作 Runnable 介面,該介面在類欄位中捕獲你的變數。
uj5u.com熱心網友回復:
正如Daniel的正確答案所說,您需要將業務邏輯移動到 a 的run方法Runnable或 a 的call方法中Callable以獲取通過回傳的值Future。
此外,在現代 Java 中,我們很少Thread直接處理類。而是使用 Executors 框架。
ExecutorService es = Executors.newFixedThreadPool( x ) ;
for( … ) { es.submit( task ) ; }
es.shutdown() ;
es.awaitTermination( … ) ;
這已經在 Stack Overflow 上討論過很多次了。因此,搜索以了解更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407128.html
標籤:
