Runnbale封装一个异步运行的任务,可以把它想象成一个没有任何参数和返回值的异步方法。Callable和Runnable相似,但是它有返回值。Callable接口是参数化的类型,只有一个方法call
public interface Callable<V> {
V call() throws Exception;
}
类型参数就是返回值的类型,例如:Callable<String>表示最终返回一个String的异步操作(计算)
Runnbale封装一个异步运行的任务,可以把它想象成一个没有任何参数和返回值的异步方法。Callable和Runnable相似,但是它有返回值。Callable接口是参数化的类型,只有一个方法call()
public interface Callable<V> {
V call() throws Exception;
}
类型参数就是返回值的类型,例如:Callable<String>表示最终返回一个String的异步操作(计算)
- //求素数
- class PrimeCallable implements Callable<int[]> {
- private int max;
- public PrimeCallable(int max) {
- this.max = max;
- }
- @Override
- public int[] call() throws Exception {
- List<Integer> result = new ArrayList<Integer>();
- for(int i = 2; i <= max; i++) {
- System.out.println("System is checking data " + i);
- if(isPrime(i)) {
- result.add(i);
- }
- }
- Integer[] iters = result.toArray(new Integer[]{});
- int[] array = new int[iters.length];
- int i = 0;
- for(Integer iter : iters) {
- array[i++] = iter;
- }
- return array;
- }
- private boolean isPrime(int data) {
- try {
- Thread.sleep(5);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- for(int i = 2; i < ((int)Math.sqrt(data)+1); i++) {
- if(data % i == 0)
- return false;
- }
- return true;
- }
- }
- Callable<int[]> primeCallable = new PrimeCallable(1000);
- FutureTask<int[]> ftask = new FutureTask<int[]>(primeCallable);
- Thread t = new Thread(ftask);
- t.start();
- int[] result = null;
- System.out.println("Waiting for result.....");
- try {
- result = ftask.get();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- for(int i = 0; result != null && i < result.length; i++) {
- if(i != 0 && i % 10 == 0) {
- System.out.println();
- }
- System.out.print(String.format("%1$-5s", result[i]));
- }
- 执行结果:
- Waiting for result.....
- System is checking data 2
- System is checking data 3
- System is checking data 4
- System is checking data 5
- System is checking data 6
- System is checking data 7
- ..................................
- System is checking data 999
- System is checking data 1000
- 2 3 5 7 11 13 17 19 23 29
- 31 37 41 43 47 53 59 61 67 71
- 73 79 83 89 97 101 103 107 109 113
- 127 131 137 139 149 151 157 163 167 173
- 179 181 191 193 197 199 211 223 227 229
- 233 239 241 251 257 263 269 271 277 281
- 283 293 307 311 313 317 331 337 347 349
- 353 359 367 373 379 383 389 397 401 409
- 419 421 431 433 439 443 449 457 461 463
- 467 479 487 491 499 503 509 521 523 541
- 547 557 563 569 571 577 587 593 599 601
- 607 613 617 619 631 641 643 647 653 659
- 661 673 677 683 691 701 709 719 727 733
- 739 743 751 757 761 769 773 787 797 809
- 811 821 823 827 829 839 853 857 859 863
- 877 881 883 887 907 911 919 929 937 941
- 947 953 967 971 977 983 991 997