欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

帶你快速搞定java多線程(2)

 更新時(shí)間:2021年07月14日 14:23:30   作者:香菜聊游戲  
這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下

1、Future的類圖結(jié)構(gòu),從整體上看下Future的結(jié)構(gòu)

圖片

圖片

首先看下future接口的函數(shù),共有5個(gè)方法。

get() 獲取執(zhí)行的結(jié)果,另外一個(gè)重載是有時(shí)間限制的get ,如果超時(shí)會有異常

isDone() 判斷future 結(jié)果是否處理完成

cancel 取消任務(wù)

2、future的使用,說的再多都么什么用,來個(gè)例子悄悄怎么用的。

package thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* @author 香菜
*/
public class FutureTest {
private ExecutorService bossExecutor = Executors.newSingleThreadExecutor();
public Future<Integer> getHpTask(Integer input) {
return bossExecutor.submit(() -> {
System.out.println("Calculating..." + input);
Thread.sleep(1000);
return input * input;
});
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
Future<Integer> calculate = new FutureTest().getHpTask(100);
System.out.println(calculate.get());
System.out.println("Done");
}
}

3、通俗理解

future 就像是去買手抓餅,你把錢給老板之后,老板對你說我做好了之后會放在旁邊的盤子里,而這個(gè)盤子就是future,你用isDone 判斷盤子里是不是有你要的手抓餅,有的話你就拿走。當(dāng)然你可以一直在那等著 get(),或者去做其他的事情,等會再來拿。

4、原理

看下

public V get() throws InterruptedException, ExecutionException {
      int s = state;
      if (s <= COMPLETING)
          s = awaitDone(false, 0L);
      return report(s);
  }
  private int awaitDone(boolean timed, long nanos)
      throws InterruptedException {
      final long deadline = timed ? System.nanoTime() + nanos : 0L;
      WaitNode q = null;
      boolean queued = false;
      for (;;) {
          if (Thread.interrupted()) {
              removeWaiter(q);
              throw new InterruptedException();
          }
          int s = state;
          if (s > COMPLETING) {
              if (q != null)
                  q.thread = null;
              return s;
          }
          else if (s == COMPLETING) // cannot time out yet
              Thread.yield();
          else if (q == null)
              q = new WaitNode();
          else if (!queued)
              queued = UNSAFE.compareAndSwapObject(this, waitersOffset,
                                                    q.next = waiters, q);
          else if (timed) {
              nanos = deadline - System.nanoTime();
              if (nanos <= 0L) {
                  removeWaiter(q);
                  return state;
              }
              LockSupport.parkNanos(this, nanos);
          }
          else
              LockSupport.park(this);
      }
  }

看下上面的代碼就是在獲取結(jié)果的時(shí)候,會先判斷狀態(tài)是否完成,如果完成了就正常返回結(jié)果,如果沒完成就會調(diào)用awaitDone,看名字也能看出來就是等待直到完成,進(jìn)入代碼可以看到就是將進(jìn)入死循環(huán)檢查狀態(tài),線程阻塞等待,直到完成。要你寫你是不是也會這樣寫?

5、總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • SpringBoot中的@EnableConfigurationProperties注解詳細(xì)解析

    SpringBoot中的@EnableConfigurationProperties注解詳細(xì)解析

    這篇文章主要介紹了SpringBoot中的@EnableConfigurationProperties注解詳細(xì)解析,如果一個(gè)配置類只配置@ConfigurationProperties注解,而沒有使用@Component或者實(shí)現(xiàn)了@Component的其他注解,那么在IOC容器中是獲取不到properties 配置文件轉(zhuǎn)化的bean,需要的朋友可以參考下
    2024-01-01
  • Spring @ComponentScan注解掃描組件原理

    Spring @ComponentScan注解掃描組件原理

    這篇文章主要介紹了Spring @ComponentScan自動掃描組件使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Java關(guān)于桶排序的知識點(diǎn)總結(jié)

    Java關(guān)于桶排序的知識點(diǎn)總結(jié)

    這篇文章給大家總結(jié)了關(guān)于JAVA中J桶排序的相關(guān)知識點(diǎn)和用法分享,有興趣的讀者跟著學(xué)習(xí)下。
    2018-04-04
  • Java中注解@Async實(shí)現(xiàn)異步及導(dǎo)致失效原因分析

    Java中注解@Async實(shí)現(xiàn)異步及導(dǎo)致失效原因分析

    Async注解用于聲明一個(gè)方法是異步的,當(dāng)在方法上加上這個(gè)注解時(shí)將會在一個(gè)新的線程中執(zhí)行該方法,而不會阻塞原始線程,這篇文章主要給大家介紹了關(guān)于Java中注解@Async實(shí)現(xiàn)異步及導(dǎo)致失效原因分析的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Java中的Set集合不允許存儲重復(fù)元素的原理詳解

    Java中的Set集合不允許存儲重復(fù)元素的原理詳解

    這篇文章主要介紹了Java中的Set集合不允許存儲重復(fù)元素的原理詳解,我們之前使用Set集合的時(shí)候發(fā)現(xiàn),Set集合的特點(diǎn)是不允許存儲重復(fù)元素,這是為什么呢,下面我們一起來研究一下,需要的朋友可以參考下
    2023-09-09
  • Springboot 如何使用 SaToken 進(jìn)行登錄認(rèn)證、權(quán)限管理及路由規(guī)則接口攔截

    Springboot 如何使用 SaToken 進(jìn)行登錄認(rèn)證、權(quán)限管理及路由規(guī)則接口攔截

    Sa-Token 是一個(gè)輕量級 Java 權(quán)限認(rèn)證框架,主要解決:登錄認(rèn)證、權(quán)限認(rèn)證、單點(diǎn)登錄、OAuth2.0、分布式Session會話、微服務(wù)網(wǎng)關(guān)鑒權(quán) 等一系列權(quán)限相關(guān)問題,這篇文章主要介紹了Springboot 使用 SaToken 進(jìn)行登錄認(rèn)證、權(quán)限管理以及路由規(guī)則接口攔截,需要的朋友可以參考下
    2024-06-06
  • 一文了解自定義MVC框架實(shí)現(xiàn)

    一文了解自定義MVC框架實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹一下MVC框架自定義實(shí)現(xiàn)過程,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-07-07
  • JVM 心得分享(加載 鏈接 初始化)

    JVM 心得分享(加載 鏈接 初始化)

    下面小編就為大家?guī)硪黄狫VM 心得分享(加載 鏈接 初始化)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • dom4j創(chuàng)建和解析xml文檔的實(shí)現(xiàn)方法

    dom4j創(chuàng)建和解析xml文檔的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猟om4j創(chuàng)建和解析xml文檔的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringMVC自定義攔截器實(shí)現(xiàn)過程詳解

    SpringMVC自定義攔截器實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了SpringMVC自定義攔截器實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評論