中國第四季電動車市場需求回溫,全年挑戰55萬輛

2016年中國電動車市場雖有取締騙補政策影響原成長力道,但在預期2017年補貼將降低而刺激消費者提前購車的情況下,今年第四季仍有很大的銷售成長空間。TrendForce旗下拓墣產業研究所最新研究顯示,今年1~9月的中國電動車市場銷售已近35萬輛,超越去年總量,預估2016年將挑戰55萬輛,引領全球電動車邁向近百萬輛市場規模。

拓墣車輛電子分析師張仙平表示,中國2014及2015年已連續兩年以超過300%的銷售成長率,超越日、美,成為全球最大電動車區域市場,2015年更占據了全球逾半的銷售量,因此中國電動車市場已成為全球電動車銷售引擎。

張仙平指出,外界持續看好中國電動車市場,然而,在2016年初中國政府積極取締騙補,以及從2016年起逐年遞減的購車補貼政策下,使得中國雖然在乘用車市場仍能維持快速成長力道,但在商用車市場上,包含電動巴士與電動專車的銷售狀況均受到衝擊,銷量呈現衰退。而中國政府也在騙補事件後,提高廠商申請生產許可證的資格,因此在補助減少而門檻提高的影響下,2017年中國電動商用車銷量仍可能衰退。

在預期2017年中國電動車購車補貼將降低的情況下,拓墣預估市場需求將集中在2016第四季,拉升中國市場電動車全年銷售達55萬輛,其中主要受惠於乘用車市場的高速成長動能。除中國市場外,美國與日本市場也一掃去年銷售頹勢,在2016年維持成長。美國市場在特斯拉Model S與Model X的熱銷下,有望締造近15萬輛的銷售佳績。拓墣預估2016年全球電動車市場將在中國市場領頭的情形下,突破95萬輛的銷售量。

全球市場研究機構TrendForce將在2016年11月10日,於臺大醫院國際會議中心舉辦「集邦拓墣2017年科技產業大預測」研討會。活動網址:

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

電動車有害道路安全?美國規定汽車不能太安靜!

根據外電報導,美國政府正式通過一則汽車行駛新規定,也就是未來一些「安靜的汽車」,如電動汽車或混合動力汽車等,在行駛速度超過時速18.6 英里 (約30 公里)的情況下,必須增加噪音警報裝置,以避免傷及行人、盲人和騎車的路人。

根據美國國家公路交通安全管理局(NHTSA)發布的這則新規定表示,該規定將在2019 年9 月1 日起生效。屆時,包括特斯拉 (TESLA)、日產汽車 (Nisson) 和豐田汽車 (TOYOTA) 等廠商都需要為所有汽車增加噪音裝置。美國政府希望通過此規定,能夠防止每年多達2,400 件的行人受傷事故,並為53 萬輛汽車增設噪音專制。

NHTSA 指出,這項新規每年約會給汽車廠商增加3,900 萬美元的花費。因為,他們要為汽車增設一個外設防水喇叭。但是,能夠透過降低交通事故而每年節省約2.5 億到3.2 億美元的醫療費用。

該規定未來將適用於全美各地區,並且涵蓋路上行駛的電動汽車和混合動力汽車等。另外,包括帶有4 個輪子、總重量低於10,000 磅的車輛,也都必須在向後或向前行駛時,在速度達到每小時30 公里之際發出聲響,以警告周遭的路人與騎車的民眾。不過,NHTSA 也認為,規定汽車喇叭可有可無,因為輪胎和風也可以製造出足夠的噪音聲響,只要該聲響能達到警告的標準即可。

該項新的規定雖然受到全美盲人主組織的歡迎,但是卻讓汽車廠商表示擔憂。因為噪音也許會太大,並且實施起來將可能相當複雜。因為,新規只規定了最低的聲音要求,卻沒有制定必須發出什麼聲音。

(本文由《》授權提供。照片來源:特斯拉)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

Java 從入門到進階之路(二十四)

在之前的文章我們介紹了一下 Java 中的  集合框架中的Collection 的泛型,本章我們來看一下 Java 集合框架中的Collection 的子接口 List。

Collection 接口有 3 種子類型,List、Set 和 Queue,其中 List 和 Set 的區別是 Set 中不能存放相同的元素,而 List 中可以,本章我們就來介紹一下 List。

 

 

 從上圖我們可以知道 List 有兩個實例類,ArrayList 和 LinkedList,

ArrayList 是數組實現,查找快,增上慢,由於是數組實現,在增和刪的時候牽扯到數組的增容,以及靠背元素,所以慢,數組是可以直接按索引查找,所以查找時較快。

LinkedList 是鏈表實現,增刪快,查找慢,由於鏈表實現,增加時只要讓前一個元素記住自己就可以了,刪除時讓前一個元素記住后一個元素,后一個元素記住前一個元素,這樣的增刪效率高但查詢時需要一個一個遍歷,所以效率低。

LinkedList 我們可以形象的比作老式手錶的鏈子,一節扣一節,增刪時只需要打開兩個之間的節扣即可,不需要牽扯到其他節扣。

ArrayList 和 LinkedList 都有各自的優缺點,在用的時候可以根據需求自行選擇,避免性能消耗。在現在計算機計算能力越來越強,做的也不是大型項目的時候,這兩個之間的性能差異我們其實是可以忽略的。

接下來我們就來看一下 List 接口的一些基礎用法,如下:

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 /**
 5  * java.util.List
 6  * 可重複集合,並且有序
 7  * 特點是可以根據下錶操作元素
 8  * ArrayList:使用數組實現,查詢更快
 9  * LinkedList:使用鏈表實現,增刪更快(收尾增刪效果更明顯)
10  */
11 
12 public class Main {
13     public static void main(String[] args) {
14         List<String> list = new ArrayList<String>();
15         list.add("one");
16         list.add("two");
17         list.add("three");
18         list.add("four");
19         /**
20          * E set(int index, E e)
21          * 將給定元素設置到制定位置上,返回原位置的元素
22          * 所以是替換元素操作
23          * 如果超出了元素的長度,則使用 add 添加,否則編譯錯誤
24          * */
25         String old = list.set(1, "2"); // 將下標為 1 的元素改為 2,返回值則是被替換的元素
26         System.out.println(old); // two
27         System.out.println(list); // [one, 2, three, four]
28 
29         /**
30          * E get(int index)
31          * 獲取給定下標對應的元素
32          * */
33         String two = list.get(1); // 獲取第二個元素
34         System.out.println(two); // 2
35 
36         /**
37          * 可以通過傳統的循環遍歷 List 集合
38          * */
39         for (int i = 0; i < list.size(); i++) {
40             System.out.println(list.get(i)); // one 2 three four
41         }
42     }
43 }

在上面的代碼中,我們通過 set 和 get 方法來設置和獲取我們想要的下標的元素,當然還有其他方法,如下:

 1 /**
 2  * List 集合提供了一對重載的 add,remove 方法
 3  * void add(int index, E e)
 4  * 將給定元素插入到指定位置,
 5  * 如果不指定下標,則插入到末尾
 6  * <p>
 7  * E remove(int index)
 8  * 從集合中刪除指定位置的元素,並將其返回
 9  */
10 
11 public class Main {
12     public static void main(String[] args) {
13         List<String> list = new ArrayList<String>();
14         list.add("one");
15         list.add("two");
16         list.add("three");
17         list.add("four");
18 
19         list.add(1, "2"); // 將下標為 1 的元素插入 2
20         System.out.println(list); // [one, 2, two, three, four]
21 
22         String string = list.remove(1); // 將下標為 1 的元素刪除,返回值為該元素
23         System.out.println(string); // 2
24         System.out.println(list); // [one, two, three, four]
25     }
26 }

我們在將 Collection 的時候講過 add 和 remove 方法,在 List 中這兩個方法被重載了,可以根據需求插入和刪除想要刪除的下標的元素,那如果我們想要獲取兩個下標之間的元素和刪除兩個下標之間的元素該怎麼辦呢,如下:

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6         List<Integer> list = new ArrayList<Integer>();
 7         for (int i = 0; i < 10; i++) {
 8             list.add(i);
 9         }
10         System.out.println(list); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
11         List<Integer> subList = list.subList(2, 5); // 獲取下標從 2 到 5 的元素,含 2 不含 5
12         System.out.println(subList); // [2, 3, 4]
13         // 將 subList 中每個元素擴大 10 倍
14         for (int i = 0; i < subList.size(); i++) {
15             subList.set(i, subList.get(i) * 10);
16         }
17         System.out.println(subList); // [20, 30, 40]
18         /**
19          * 對子集的修改,就是修改原集合相應內容
20          * */
21         System.out.println(list); // [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]
22         /**
23          * 刪除集合中 2-5 的元素
24          * */
25         list.subList(2, 5).clear();
26         System.out.println(list); // [0, 1, 5, 6, 7, 8, 9]
27     }
28 }

我們說集合和數組有很多相似的地方,那課可以進行相互轉換呢,當然是可以的,如下:

 1 import java.util.ArrayList;
 2 import java.util.Collection;
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6         Collection<String> collection = new ArrayList<String>();
 7         collection.add("one");
 8         collection.add("two");
 9         collection.add("three");
10         collection.add("four");
11         System.out.println(collection); // [one, two, three, four]
12         /**
13          * 集合提供了一個 toArray,可以將當前集合轉換為數組
14          * */
15         // Object[] array = collection.toArray(); // 不常用
16         /**
17          * collection.size() 表示要轉換的數組的 length
18          * 如果大於給定的 collection 的 size,則自動填充完整 array
19          * 如果小於給定的 collection 的 size,則自動創建給你一樣長度的 size
20          * */
21         String[] array = collection.toArray(new String[collection.size()]);
22         System.out.println(array.length); // 4
23         for (String string : array) {
24             System.out.println(string); // one two three four
25         }
26 
27         String[] array1 = collection.toArray(new String[6]);
28         System.out.println(array.length); // 4
29         for (String string : array1) {
30             System.out.println(string); // one two three four null null
31         }
32 
33         String[] array2 = collection.toArray(new String[1]);
34         System.out.println(array.length); // 4
35         for (String string : array2) {
36             System.out.println(string); // one two three four
37         }
38     }
39 }

在上面的代碼中我們實現了集合轉換為數組的方法,接下來我們再看一下數組轉換為集合的方法:

 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 import java.util.List;
 4 
 5 /**
 6  * 數組轉換為集合
 7  * 需要注意,轉換隻能轉換為 List 集合
 8  * 使用的是數組的工具類 Arrays 的靜態方法 asList
 9  * 只能轉換為 List 集合的主要原因是:Set 不能存放重複元素
10  * 所以若轉換為 Set 集合可能會出現丟失元素的情況
11  */
12 public class Main {
13     public static void main(String[] args) {
14         String[] array = {"one", "two", "three", "four"};
15         List<String> list = Arrays.asList(array);
16         System.out.println(list); // [one, two, three, four]
17 
18         /**
19          * 向集合中添加元素,會出現編譯錯誤
20          * 相當於在原數組添加元素
21          * 該集合時由數組轉換過來的,那麼該集合就表示原來的數組
22          * 所以對集合的操作就是對數組的操作
23          * 那麼添加元素會導致原數組擴容
24          * 那麼久不能表示原來的數組了
25          * 所以不允許向該集合添加元素
26          */
27         // list.add("five"); // 編譯錯誤 Exception in thread "main" java.lang.UnsupportedOperationException
28 
29         /**
30          * 若希望增刪元素,需要另外創建一個集合
31          * */
32         /**
33          * 所有的集合都提供了一個帶有 Collection 類型參數的構造方法
34          * 該構造方法稱為:複製構造器
35          * 作用是在創建當前集合的同時,
36          * 集合中包含給定集合中的所有元素
37          * */
38         // List<String> list1 = new ArrayList<String>(list); // 複製構造器,一步到位
39         List<String> list1 = new ArrayList<String>();
40         list1.addAll(list);
41         list1.add("five");
42         System.out.println(list1); // [one, 2, three, four, five]
43 
44         /**
45          * 修改集合元素,數組元素也會改變
46          * */
47         list.set(1, "2");
48         System.out.println(list); // [one, 2, three, four]
49         for (String string : array) {
50             System.out.println(string); // one 2 three four
51         }
52     }
53 }

    

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

Flutter學習筆記(35)–通知Notification,Flutter學習筆記(35)–通知Notification

如需轉載,請註明出處:Flutter學習筆記(35)–通知Notification

通知的NotificationListener和我們之前寫的事件的Listener一樣,都是功能性的組件,而且也都是從子節點順着widget樹向上冒泡,不同的是,事件的Listener不可以被終止,但是通知的NotificationListener是可以被終止的。

是否終止根據NotificationListener的返回值來決定。

說一下我個人的理解:

通知Notification的發送是通過disPatch進行分發的,就好像Android裏面的事件分發,當NotificationListener監聽到了通知事件,這時候會走到其onNotification回調中,根據回調中的返回值類型(true還是false)來決定是否還繼續向父親節點發送通知。

返回true就是繼續分發,返回false就是終止分發,返回false就意味着上層節點的NotificationListener就不會接收到通知事件了。

舉個例子就是:

兩層NotificationListener嵌套,子節點的NotificationListener返回true,那麼父親節點的NotificationListener可以接收到通知事件,反之如果返回false,那麼父親節點的NotificationListener就不會接收到通知事件了。

下面看一下demo示例:

demo就是簡單的發送通知,監聽到通知事件后改變text的內容。

1.創建一個事件通知類,要繼承Notification,它其實就是一個數據載體,在裏面定義通知數據的類型和內容。

import 'package:flutter/material.dart';

class MyNotification extends Notification{
  String notificationStr;

  MyNotification(this.notificationStr);
}

2.NotificationListener的使用和通知事件的分發

import 'package:flutter/material.dart';
import 'package:study_app/util/MyNotification.dart';

class NotificationDemo extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _NotificationDemoState();
  }
}

class _NotificationDemoState extends State {
  String _notificationData = 'default_data';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'NotificationDemo',
      home: new Scaffold(
          appBar: AppBar(
            title: Text('NotificationDemo'),
          ),
          body: NotificationListener<MyNotification>(
            onNotification: (notification) {
              setState(() {
                _notificationData = notification.notificationStr;
              });
              return true;
            },
            child: Column(
              children: <Widget>[
                Text(_notificationData),
                Builder(
                  builder: (context) {
                    return Container(
                      width: double.infinity,
                      child: RaisedButton(
                          child: Text('發送通知'),
                          onPressed: () {
                            MyNotification('notification_data')
                                .dispatch(context);
                          }),
                    );
                  },
                )
              ],
            ),
          )),
    );
  }
}

在看書的時候,作者強調了一種錯誤的寫法,如下圖註釋的部分:

原因是通知在分發的時候,需要一個context參數,這個參數指的是Notification監聽的子widget的context,如果按照註釋部分的寫法的話,context是根widget的,這樣會導致監聽不到子widget了。

所以需要我們通過Builder構建出我們子widget的context,這裏需要特別注意一下。

最後看一下效果截圖:

   

以上!有任何疑問歡迎留言!

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

Oracle SQL調優系列之SQL Monitor Report

@

目錄

  • 1、SQL Monitor簡介
  • 2、捕捉sql的前提
  • 3、SQL Monitor 參數設置
  • 4、SQL Monitor Report
    • 4.1、SQL_ID獲取
    • 4.2、Text文本格式
    • 4.3、Html格式
    • 4.4、ACTIVE格式
    • 4.5 SQL Monitoring list
  • 5、SQL Monitor Report查詢
    • 5.1、查看所有的sql monitor report
    • 5.2、查看某個sql的sql monitor report
    • 5.3、查看某個sql的整體性能
    • 5.4、查看整個系統的性能

1、SQL Monitor簡介

sql monitor是oracle官方提供的自動監控符合特定條件的SQL,用於收集執行時的細節信息的監控工具,常用於sql調優和系統性能監控

2、捕捉sql的前提

sql monitor 捕捉sql的前提:

  • 并行執行的sql語句
  • 單次執行消耗的CPU或IO超過5秒
  • statistics_level級別必須是TYPICAL 或者ALL
  • 使用/* +MONITOR*/ HINT的SQL語句

3、SQL Monitor 參數設置

  • STATISTICS_LEVEL必須設置為:’TYPICAL’(缺省)或者 ‘ALL’
  • CONTROL_MANAGEMENT_PACK_ACCESS設置為:’DIAGNOSTIC+TUNING’

查看statistics_level參數

show parameter statistics_level;

建議還是改變Session就可以

alter session set statistics_level=ALL;

查看參數CONTROL_MANAGEMENT_PACK_ACCESS

show parameter CONTROL_MANAGEMENT_PACK_ACCESS;

4、SQL Monitor Report

本博客採用DBMS_SQLTUNE包DBMS_SQLTUNE.report_sql_monitor的方式獲取,報告格式有:’TEXT’,’HTML’,’XML’ ,’ACTIVE’,其中’ACTIVE’只在11g R2以後才支持

4.1、SQL_ID獲取

sql monitor使用,必須在sql中使用/* +MONITOR*/ Hint,然後數據會存在v$sql_monitor表裡

隨意找條sql,注意要加/*+ moniotr*/


select /*+ moniotr*/ a.user_code, a.full_name, a.user_pwd, c.unit_code, c.unit_name
  from base_user a
  left join (select ur.user_code, ur.unit_code
               from t_user_role ur
              where ur.user_role < 10) b
    on a.user_code = b.user_code
  left join t_unit_info c
    on b.unit_code = c.unit_code
 where c.unit_code in
       (select uinfo.unit_code
          from t_unit_info uinfo
         start with uinfo.unit_code = '15803'
        connect by prior uinfo.unit_code = uinfo.para_unit_code);
     

提供sql查詢,獲取sql_id

select sql_id,sql_text from v$sql_monitor where sql_text like '%t_unit_info%

4.2、Text文本格式

將上面查詢到的sql_id改下,然後執行如下SQL:

SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
SET TRIM ON
SET TRIMSPOOL ON
SET ECHO OFF
SET FEEDBACK OFF
spool report_sql_monitor_text.txt
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(
  SQL_ID => 'g9rtj389t0g66',
  TYPE => 'TEXT',
  REPORT_LEVEL => 'ALL') AS REPORT
FROM dual;
spool off

獲取到text格式的sql monitor

4.3、Html格式

SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
SET TRIM ON
SET TRIMSPOOL ON
SET ECHO OFF
SET FEEDBACK OFF
spool report_sql_monitor_html.html
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(
  SQL_ID => 'g9rtj389t0g66',
  TYPE => 'HTML',
  REPORT_LEVEL => 'ALL') AS REPORT
FROM dual;
spool off

獲取到對應報告,可以看到執行計劃、Buffer Gets 等等信息

4.4、ACTIVE格式

ACTIVE格式需要下載相應的flash組件、腳本,詳細見SQL Monitor Report 使用詳解

SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
SET TRIM ON
SET TRIMSPOOL ON
SET ECHO OFF
SET FEEDBACK OFF
spool report_sql_monitor_active.html
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(
  SQL_ID => '2rjh5d5k2yujz',
  TYPE => 'ACTIVE',
  REPORT_LEVEL => 'ALL',
  BASE_PATH => 'http://ip/script') AS REPORT
FROM dual;
spool off

4.5 SQL Monitoring list

如果要獲取所有sql monitor,就可以使用如下SQL:

SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
SET TRIM ON
SET TRIMSPOOL ON
SET ECHO OFF
SET FEEDBACK OFF
SPOOL report_sql_monitor_list.html
SELECT dbms_sqltune.report_sql_monitor_list(
  type         => 'HTML',
  report_level => 'ALL') AS report
FROM dual;
SPOOL OFF

5、SQL Monitor Report查詢

提供sql monitor常用的查詢腳本

5.1、查看所有的sql monitor report

  • 查看所有的sql monitor report
   select dbms_sqltune.report_sql_monitor from dual;

5.2、查看某個sql的sql monitor report

  • 查看某個sql的sql monitor report
  SELECT DBMS_SQLTUNE.report_sql_monitor(sql_id => '2rjh5d5k2yujz', type => 'TEXT') from dual;

5.3、查看某個sql的整體性能

  • 查看某個sql的整體性能
   SELECT DBMS_SQLTUNE.report_sql_monitor_list(sql_id=>'2rjh5d5k2yujz',type =>'TEXT',report_level => 'ALL') AS report FROM dual;

5.4、查看整個系統的性能

  • 查看整個系統的性能
   SELECT DBMS_SQLTUNE.report_sql_monitor_list(type =>'TEXT',report_level => 'ALL') AS report FROM dual;

相關SQL腳本下載:sql download

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

聚甘新

JVM源碼分析之Object.wait/notify(All)完全解讀

概述

本文其實一直都想寫,因為各種原因一直拖着沒寫,直到開公眾號的第一天,有朋友再次問到這個問題,這次讓我靜心下來準備寫下這篇文章,本文有些東西是我自己的理解,比如為什麼JDK一開始要這麼設計,初衷是什麼,沒怎麼去找相關資料,所以只能談談自己的理解,所以大家看到文章之後可以談談自己的看法,對於實現部分我倒覺得說清楚問題不大,code is here,看明白了就知道怎麼回事了。

Object.wait/notify(All)大家都知道主要是協同線程處理的,大家用得也很多,大概邏輯和下面的用法差不多

看到上面代碼,你會有什麼疑惑嗎?至少我會有幾個問題會問自己: * 為什麼進入wait和notify的時候要加synchronized鎖 * 既然加了synchronized鎖,那當某個線程調用了wait的時候明明還在synchronized塊里,其他線程怎麼進入到鎖里去執行notify的 * 為什麼wait方法可能會拋出InterruptedException異常 * 如果有多個線程都進入wait狀態,那某個線程調用notify喚醒線程時是否按照順序喚起那些wait線程 * wait的線程是在某個線程執行完notify之後立馬就被喚起嗎 * notifyAll又是怎麼實現全喚起的 * wait的線程是否會影響load

如果上面這些問題也都是你想了解的,那這篇文章或許能給你一個答案。

為何要加synchronized鎖

從實現上來說,這個鎖至關重要,正因為這把鎖,才能讓整個wait/notify玩轉起來,當然我覺得其實通過其他的方式也可以實現類似的機制,不過hotspot至少是完全依賴這把鎖來實現wait/notify的。

如果要我們來實現這種機制我們會怎麼去做,我們知道wait/notify是為了線程間協作而設計的,當我們執行wait的時候讓線程掛起,當執行notify的時候喚醒其中一個掛起的線程,那需要有個地方來保存對象和線程之間的映射關係(可以想象一個map,key是對象,value是一個線程列表),當調用這個對象的wait方法時,將當前線程放到這個線程列表裡,當調用這個對象的notify方法時從這個線程列表裡取出一個來讓其繼續執行,這樣看來是可行的,也比較簡單,那現在的問題這種映射關係放到哪裡。而synchronized正好也是為線程間協作而設計的,上面碰到的問題它也要解決,或許正因為這樣wait和notify的實現就直接依賴synchronzied(monitorenter/monitorexit是jvm規範里要求要去實現的)來實現了,這隻是我的理解,可能初衷不是這個原因,這其實也是這篇文章遲遲未寫的一個原因吧,因為我無法取證自己的理解是對的,歡迎各位在這塊談談自己的見解。

wait方法執行后未退出同步塊,其他線程如何進入同步塊

這個問題其實要回答很簡單,因為在wait處理過程中會臨時釋放同步鎖,不過需要注意的是當某個線程調用notify喚起了這個線程的時候,在wait方法退出之前會重新獲取這把鎖,只有獲取了這把鎖才會繼續執行,想象一下,我們知道wait的方法是被monitorenter和monitorexit包圍起來,當我們在執行wait方法過程中如果釋放了鎖,出來的時候又不拿鎖,那在執行到monitorexit指令的時候會發生什麼?當然這可以做兼容,不過這實現起來還是很奇怪的。

為什麼wait方法可能拋出InterruptedException異常

這個異常大家應該都知道,當我們調用了某個線程的interrupt方法時,對應的線程會拋出這個異常,wait方法也不希望破壞這種規則,因此就算當前線程因為wait一直在阻塞,當某個線程希望它起來繼續執行的時候,它還是得從阻塞態恢復過來,因此wait方法被喚醒起來的時候會去檢測這個狀態,當有線程interrupt了它的時候,它就會拋出這個異常從阻塞狀態恢復過來。

這裡有兩點要注意: * 如果被interrupt的線程只是創建了,並沒有start,那等他start之後進入wait態之後也是不能會恢復的 * 如果被interrupt的線程已經start了,在進入wait之前,如果有線程調用了其interrupt方法,那這個wait等於什麼都沒做,會直接跳出來,不會阻塞

被notify(All)的線程有規律嗎

這裏要分情況: * 如果是通過notify來喚起的線程,那先進入wait的線程會先被喚起來 * 如果是通過nootifyAll喚起的線程,默認情況是最後進入的會先被喚起來,即LIFO的策略

notify執行之後立馬喚醒線程嗎

其實這個大家可以驗證一下,在notify之後寫一些邏輯,看這些邏輯是在其他線程被喚起之前還是之後執行,這個是個細節問題,可能大家並沒有關注到這個,其實hotspot里真正的實現是退出同步塊的時候才會去真正喚醒對應的線程,不過這個也是個默認策略,也可以改的,在notify之後立馬喚醒相關線程。

notifyAll是怎麼實現全喚起的

或許大家立馬想到這個簡單,一個for循環就搞定了,不過在jvm里沒實現這麼簡單,而是藉助了monitorexit,上面我提到了當某個線程從wait狀態恢復出來的時候,要先獲取鎖,然後再退出同步塊,所以notifyAll的實現是調用notify的線程在退出其同步塊的時候喚醒起最後一個進入wait狀態的線程,然後這個線程退出同步塊的時候繼續喚醒其倒數第二個進入wait狀態的線程,依次類推,同樣這這是一個策略的問題,jvm里提供了挨個直接喚醒線程的參數,不過都很罕見就不提了。

wait的線程是否會影響load

這個或許是大家比較關心的話題,因為關乎系統性能問題,wait/nofity是通過jvm里的park/unpark機制來實現的,在linux下這種機制又是通過pthread_cond_wait/pthread_cond_signal來玩的,因此當線程進入到wait狀態的時候其實是會放棄cpu的,也就是說這類線程是不會佔用cpu資源。

 

一起來學習吧:

PerfMa KO 系列課之 JVM 參數【Memory篇】

Hotspot GC研發工程師也許漏掉了一塊邏輯

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

聚甘新

興大發明電動車無線充系統,亦可傳輸數位資訊

一直以來,電動車無線充電技術就是各方研究努力的方向;最近中興大學電機工程學系的團隊開發了一個可以讓電動車無線充電的新系統,除此之外,還可以在傳輸的過程中進行資料的雙向傳輸。

由中興大學電機工程學系的講座教授林俊良和博士候選人黃志誠帶領的團隊,成功研發出一套可行性高、價格也相對低廉的電動車無線充電系統,且在電動車充電時還能雙向傳輸數位資訊,例如:汽車車牌、電池電量、緊急命令等。

資料藉由磁場傳輸,不如傳統無線通訊設備(如:Wi-Fi、藍芽、Zigbee)需要配對和設定,因此相對簡單。電動車充電時亦不受電磁波干擾,多輛車子同時充電也無互相干擾的顧慮。電流過載時自動在8 秒內斷電並提出警訊,多餘的電力則會回饋給充電站。此設計不僅延長了電池壽命,也不會浪費電力。

林俊良表示,此項非接觸充電系統可應用於集合型住宅大樓的微型電網,充電的多餘電力可以回饋給社區,將來可望朝商業化發展。此創作已通過四項專利、2016 年台灣創新發明大賽鉑金獎、2016 年東元綠能大賽人文獎等,研究成果發表於2017 年 1 月電機電子工程學會出刊的《IEEE Transactions on Industrial Electronics》刊物上,進階版本於IEEE Transactions on Power Electronics 複審中,亦有第五項專利正在審查。

()

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

台灣首批Tesla Model S交車;超級充電站同時啟用

於2016年九月正式入台的美商Tesla於,1月23 日於舉辦了首次在台交車典禮,共交出5輛 Model S。同時,有6個超級充電站也在台北花博公園啟用,將來還將擴展至中南部,讓車主可以隨心所欲馳騁。

關於大眾最關心的續航問題,Model S的單次充電可行駛高達632公里。特斯拉表示,設置於花博公園的6個超級充電站,充電20分鐘就可以充滿一半的電量。目的充電站則用於長時間充電,例如上班、購物、或旅遊時適用。

花博爭豔館南側的特斯拉全臺第一個超級充電站。

Tesla的保固條件也領先業界,保證電池和驅動元件擁有8年的原廠保固,車身方面則是4年內或8萬公里享有原廠保固。台灣第一個原廠維修站設置於台北內湖,維修標準比照北美與歐洲。Tesla 亞太區總裁任宇翔表示,未來也將擴展原廠維修中心至南部,預計在台中及台南加設維修站。任宇翔也建議車主在行駛2萬公里時就定期進廠保養。

現階段除了花博有超級充電站之外,市政府也全力協助Tesla推廣電動車業務,將來在台北市之公有停車場將會設含有歐規美規兩種接頭的充電站。展望2017年,Tesla也提到將在今年引進Model X房車;至於Model 3,現階段預購最快則到等到2018年中才可以交車。

(圖片來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧

Tesla樽節,2016年 SolarCity裁員人數達 20%

根據《路透社》的報導指出,美國電動車大廠特斯拉(TESLA) 在 2016  年底所收購的太陽能電池廠商 SolarCity,截至 2016 年底為止,總計已經裁減了 20% 的員工。顯示 TESLA 需要藉由 SolarCity 的樽節措施,來平衡該公司的支出。原因是當前美國太陽能市場,依舊處於需求不足的低迷狀態。

報導指出,根據 SolarCity 在 1 日對美國證券交易委員會提交的相關文件指出,該公司截至 2016 年底的員工總數為 12,243 人,比一年前減少了 19.8%。而在被 TESLA 收購前,營運就出現困難的 SolarCity 已經提出相關裁員計畫,預計裁減包括運營、安裝、製造、銷售和市場行銷等部門職位,只是當時並沒有提出確切人數。據了解,在進入 2017 年後,裁員仍將會持續。

SolarCity 過去是全美最大的屋頂太陽能系統製造和安裝公司。按照過去的計畫,SolarCity 曾希望在 2018 年獲得美國一百萬太陽能家庭用戶,但是後來縮減了目標,主要原因是市場需求不足。2017 年初,由於內華達州一項太陽能補助政策取消,使 SolarCity 裁減該州 550 個工作職位。整體來說,2016 年 SolarCity 在業務上的衰退和過去快速擴張的情況形成鮮明對比,因 2015 年同期統計,該公司的員工人數較前一年成長了 68.7%。

事實上,TESLA 執行長 Elon Musk 當時併購 SolarCity 就引來許多負面聲音。原因是 Elon Musk 與 SolarCity 關係非淺,SolarCity 的創辦人為 Elon Musk 的親戚。所以該項收購案遭質疑是「左口袋到右口袋」的資本金錢遊戲。

為了改善 SolarCity 的財務狀況,Elon Musk 收購完成之後,TESLA 開始對 SolarCity 的業務進行整合。2017 年 1 月,TESLA 表示將會縮減太陽能系統的廣告預算,並且利用特斯拉現有的實體店零售網路,銷售屋頂太陽能發電系統。另外,SolarCity 也將縮減租賃等模式,轉向現金銷售,以便獲得更多現金收入,達到降低成本的效果。

(合作媒體:。圖片出處:Tesla)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧

和Tesla抗衡,Volvo平價電動車預計2019上市

瑞典汽車大廠Volvo(富豪汽車)的CEO Lex Kerssemakers在日內瓦汽車展上向記者透漏公司將於2019上市自家電動車,價格約落在$35,000至$40,000美元間。

據媒體Automotive News報導,在這之前,Volvo雖有兩款油電混和車XC90 SUV和V60上市,但不曾真正推出過純電動車。Volvo定出的價格也和電動車龍頭Tesla旗下車款Model 3具競爭力。預定於2017年末上市的Tesla Model 3擁有215英哩的續航,優惠期間可以35,000的價格預購;Chevrolet(雪佛蘭汽車)的電動車Bolt則擁有238英哩的續航里程,優惠價格落在37,500美元。

雖然車體尺寸等具體資訊都還沒有公布,但Kerssemakers表示續航力可達250英哩。外界也推估以這個價位大概是一般轎車而緊湊型轎車(Compact Car)或休旅車。

(首圖來源:Volvo)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※超省錢租車方案

※別再煩惱如何寫文案,掌握八大原則!

※回頭車貨運收費標準

※教你寫出一流的銷售文案?

FB行銷專家,教你從零開始的技巧