java并发编程核心方法与框架_Java并发编程核心方法与框架-Future和Callable的使用...
Callable接口與Runnable接口對比的主要優點是Callable接口可以通過Future獲取返回值。但是Future接口調用get()方法取得結果時是阻塞的,如果調用Future對象的get()方法時任務尚未執行完,則調用get()方法時一直阻塞到此任務完成。如果前面的任務耗時很多,則后面的任務調用get()方法就呈阻塞狀態,大大影響運行效率。主線程不能保證首先獲得的是最先完成任務的返回值,這是Future的缺點。
public class MyCallable implements Callable {
private int age;
public MyCallable(int age) {
super();
this.age = age;
}
@Override
public String call() throws Exception {
TimeUnit.SECONDS.sleep(8);
return "返回值 年齡是:" + age;
}
public static void main(String[] args) {
MyCallable myCallable = new MyCallable(22);
int corePoolSize = 2;
int maximumPoolSize = 3;
int keepAliveTime = 5;
TimeUnit unit = TimeUnit.SECONDS;
LinkedBlockingDeque workQueue = new LinkedBlockingDeque();
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
Future future = threadPoolExecutor.submit(myCallable);
try {
System.out.println(System.currentTimeMillis());
String string = future.get();
System.out.println(string);
System.out.println(System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印結果如下:
1470904027660
返回值 年齡是:22
1470904035663
從打印結果看,可見get()方法具有阻塞的特性。
方法submit()不僅可以傳入Callable對象,還可以傳入Runnable對象,submit()方法支持有返回值和無返回值。
public class Run {
public static void main(String[] args) {
try {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("打印的信息");
}
};
ExecutorService executorService = Executors.newCachedThreadPool();
Future future = executorService.submit(runnable);
System.out.println(future.get() + " " + future.isDone());
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印結果如下:
打印的信息
null true
方法isDone()無阻塞特性。
使用ExecutorService接口中的方法submit(Runnable, T result)
public class User {
private String username;
private String password;
//省略getter setter
}
public class MyRunnable implements Runnable {
private User user;
public MyRunnable(User user) {
super();
this.user = user;
}
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
user.setUsername("admin");
user.setPassword("123456");
}
}
public class Main {
FutureTask task;
public static void main(String[] args) {
try {
User user = new User();
MyRunnable myRunnable = new MyRunnable(user);
int corePoolSize = 10;
int maximumPoolSize = 10;
int keepAliveTime = 10;
TimeUnit unit = TimeUnit.SECONDS;
LinkedBlockingDeque workQueue = new LinkedBlockingDeque<>();
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
Future future = executor.submit(myRunnable, user);
System.out.println(System.currentTimeMillis());
System.out.println(user.getUsername() + "-" + user.getPassword());
user = future.get();
System.out.println(user.getUsername() + "-" + user.getPassword());
System.out.println(System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
}
}
控制臺打印結果如下:
1470908214853
null-null
admin-123456
1470908216855
總結
以上是生活随笔為你收集整理的java并发编程核心方法与框架_Java并发编程核心方法与框架-Future和Callable的使用...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 会java学scala多久_Scala中
- 下一篇: lisp ssget 浩辰_AutoCA