日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java并发编程核心方法与框架_Java并发编程核心方法与框架-Future和Callable的使用...

發布時間:2023/12/15 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的使用...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。