A. 新手如何入門編程
首先,入門編程需要一個循序漸進的過程,需要先了解基本的編程語法,從解決基本的數學問題開始,進而展開編程語言的學習。
其次,入門編程要構建一個初步的編程思維。所謂的編程思維就是通過編程語言來解決問題的思路和方式,簡單的說就是一個抽象的過程。鍛煉編程思罩滾胡維一個最為有效的辦法就是完成大量的實驗,通過對於實驗的不斷總結從而形成自己的編程思路。所以,學習編程如果有捷徑的話,那麼就是不停地做實驗。
最後,入門編程需要有一個完整的知識結構,這個知識結構涉及到操作系統、計算機網路、資料庫、演算法設計和數據結構,在當前的大數據、雲計算時代背景下,還需要掌握大數據和雲計算的相關知識,尤其是IaaS和PaaS。這些知識完全可以在學習編程語言的過程中同時學習,這些內容的掌握程度對於編程能力會有較大的影響。
最後,目前編程語言比較多,對於基礎比較薄弱的初學者來說,可以從Python語言開始學起。
推薦教程:北京尚學堂Python400集,內容多並且系統。從入門開始,適合小白上手,有項目,不枯燥。老牌機構講師,專業並且干貨多。在他們的官網上或者B站上都有,可以去看看,評價不錯,是我目前看到的最值得推薦的教程。
跟對人,選對書!我是碼農阿勇,一個致力於分享編程知識的平台!
編程的話,是一種技能,理論上,和其它技能學習的方式都差不多,以練習為主,但注意的是,編程有個編程思維的東西,你得用這個思維去理解,否則,是入不了門的。
練習編程思維
這種感覺,就像是武俠小說裡面的任督二脈,編程思維會了之後,你就開始真正入門了,它就像你的地基,至於其它語言,都是在上面建房子而以。我記得大一剛入門編程時,全班半期考就一個人及格,就是因為編程思維,大家大腦轉不過彎。對了,如果你數學基礎好,這里是有加分的,如果基礎不好也沒關系,慢慢的,一邊編程,一邊也會提高你的數學能力。
現在網路比較發達,資料很多,你可以找幾篇編程思維的文章看下,語言不限。
選擇一門語言
我是二十年前上的大學,所以當初的入門語言物攔是C語言,如果你不是科班出身,我覺得就不要選C了,科班會教很多語言,我數了下,當年學了有不下七、八種語言,其實用的不多,有些也淘汰了。你可以選擇當下最熱的語言進行,個人建議Python,學習Python的話,即使你不是做編程工作,它也可以成為你的助手。
當然,如果你對Web開發比較感興趣,你也可以學習javaScript。
學習的話,可以看書和上網查資料,但對於新手來說,直接看視頻是比較好的,基礎視頻基本是不用錢的,可以上慕課網,搜索些基礎視頻,一邊看視頻一邊寫代碼,記住,編程是個工程活,一定要寫代碼,不寫的話,看完就忘。
開始一個項目
語言學會後,不代表你會編程,你可能會寫幾行代碼,或者一些小工具,但要做項目,是需要掌握一個語言生態體系的,而生態體系,又需要找一個方向。
我這邊舉個Web方向的例子,你想做Web前端開發,你得知道
什麼是HTML、CSS、JavaScript
什麼是ES6、7等
什麼是NPM、Node.js
什麼是模塊化、什麼是組件化、什麼是函數式編程
什麼是React、什麼是Vue等等
當然,這些可以是你做完項目後知道的,也可以是你買本成體系的專業書籍知道的,是的,開始項目後,才開始你的成長之路,這時候,你得開始讀書了。如果你不喜歡讀書,那真的不適合編程了,編程真正上體現了什麼叫做終身學習。
如果你沒有比較好的項目,我建議,你如果學習JavsScript的Web方向編程,建議你做個Web版本的ToDO試下,一個比較簡單,但是可以涉及很多方面的項目,網上也有很多例子,你可以一邊做一邊學習。
如果是Python,我建議你先做爬蟲類的項目,自己做個電影站之類的工具,爬取一些數據,試驗下。
不斷的堅持
最後就是不斷的堅持了,你會碰到很多問題,這些問題,你一定得去Google和StackOverflow,然後經常翻一翻備襲Github上別人的一些代碼,基本上就開始成長之路。
先要了解編程是要干什麼。編程,就是讓計算機代為解決某個問題,對某個計算體系規定一定的運算方式,使計算體系按照該計算方式運行,並最終得到相應結果的過程。
為了使計算機能夠理解人的意圖,人類就必須將需解決的問題的思路、方法和手段通過計算機能夠理解的形式告訴計算機,使得計算機能夠根據人的指令一步一步去工作,完成某種特定的任務。這種人和計算體系之間交流的過程就是編程。
對於計算機來說,一切不過都是數字。那我們編寫代碼的目的其實就是告訴計算機兩件事,一是有哪些數,二是該怎麼算!因此程序的組成也就是兩個部分:數和數的組織方式,即數據結構,和運算的邏輯,即演算法。而所有的編程語言就是要把這兩個部分的內容表達好。
一個完整的編程語言,一般會包含如下內容:數據的聲明與類型、運算符與關鍵詞、3大語句(賦值、選擇、循環)、數據結構、方法、類等。其中數據的聲明與類型、數據結構是用於表達數和數的組織方式;剩餘的除了類以外則是表達運算的邏輯;而類是最特殊的,它既包含數據結構又包含運算邏輯。
有了以上對編程語言的整體了解了以後,就是逐個理解掌握相關的知識點。而這些知識點往往是一個拉一個,理解了一個後面那個也就好理解:
一切根源是數。數要分類型->類型,數要存儲->變數、常量,數之間有關系->數據結構,數要計算->運算符,數要按照規則計算->3大語句,計算規則要整理出來重復使用->方法,數與方法關系緊密要在一起->類、封裝,類與類之間有相似性->繼承,繼承的各子類有差異->多態,封裝、繼承、多態搞到一起->面向對象編程
我們要把握這些語言知識點之間的這種脈絡,知道他們因何而來,又會往哪裡去發展,最重要的是知道它們的出現是為了解決什麼問題。
在掌握語言的基礎上,還要學習如何運用計算機的資源。計算機資源是由各種平台進行封裝,以SDK的形式提供的。編程語言是一種表達的能力,而JDK、AndroidSDK等SDK則是資源的使用,也就是表達的內容。我們要分清語言與資源的區別,才能最終運用自如。學習其實就是一個學會分類的過程,知道哪是哪,知道分門別類,找起來才不會找錯。
在學習編程時往往會遇到一個難題:計算機專業相關的知識點非常多,看起來又高深莫測的樣子。要能夠掌握而且快速掌握大量的編程知識,我們要有一個干凈利落的切入角度。
我們首先要弄清楚一個問題:什麼是知識?知識就是解決問題辦法的總結。我們接觸到的所有知識都是為了解決某個問題才出現的,你知道了那個問題,明白了別人解決問題的思路,這個解決辦法也就掌握了。很多同學陷入知識的海洋弄得雲里霧里辨不清方向,就是因為不知道這些個知識是幹嘛用的,不知道它們是為解決什麼問題而出現的。而計算機技術里的很多知識更是這樣,為了解決問題而出現,出現就是一大串。你不知道它要解決什麼問題,就等著被繞暈吧。所以我們先要把編程中遇到的問題找出來,再理解這個問題是怎麼解決的,而這個解決的辦法就是所謂的「知識點」。因此要經常發出「靈魂三問」
這種學習的方法叫做「面向問題的學習方法」。用這種學習方法,在學習中接觸到新知識的時候,馬上意識到這是某種問題的解決辦法,並且從問題切入,相信很快就能把新知識理解並加以運用。
最後,也最根本的一條,編程的學習是拿來用的,也只有會用才能真正掌握語言,理解編程相關知識。想學編程的話,可以來看看我發布的零基礎學編程課程,學起來既簡單又很好玩喔。
傳統的教室培訓有許多好處,但它不適合持續學習的模式或當今IT人員繁忙的日程安排教室學習有時需要提前幾個月安排,具體取決於課程可用性和員工的工作重點而且,固定時間的小組培訓課程也不太可能是最適合你學習速度的理想之選課程的許多部分甚至可能與你在企業中的特定職業角色無關隨著業務和IT需求的快速變化,你是否能夠確保在教室培訓結束後馬上就能用到課堂上學到的知識?你是否需要在不久的將來刷新一些知識,例如在實施和升級之前或是在解決新出現的業務問題時?一次性教室學習的局限性使其非常不適合今天的許多IT專業人士數字化培訓正在迅速普及,因為它非常適合時間緊迫的IT人員,能夠滿足其持續學習的需求它可以讓您只在您需要的時候學習您需要的東西,無需參加整個課程或花時間前往異地按照您自己的節奏,根據需要隨時暫停和重復分段按照您自己的時間表,根據您的工作日歷將培訓分成幾天或幾周數字化學習的越來越顯著的優勢在於其地點上的靈活性你可以在自己的書桌前、員工培訓室或家庭辦公室中舒適地學習也許你經常外出,往返於業務地點或客戶項目現場?或者在日常通勤中學習?無論在哪裡學習,自考總是不建議的,誰試誰哭
我建議你可以選擇一門簡單的容易入門的語言python。頭條上一搜一大把入門視頻。可以幫你快速找到編程的樂趣和感覺。最重要的是建立你的自信心。
有了興趣和自信以後,如果還想深入和提高。就可以嘗試學習數據結構和演算法。頭條里也有很多視頻教程。這樣可以幫你步入專業。
之後你可以嘗試學習Java或者go。多學一門語言可以讓你有不同的體驗和認識。
之後你可以嘗試學習架構知識,閱讀DDIA。我正在分享閱讀這本書,挑戰的是英文版。你可以到我的主頁里看看。
想學編程,首先得選一門編程語言,常見的編程語言有:
c/c++,擅長性能,但是開發效率低
java,性能略差,但是開發效率較高,基礎庫非常完善,可用框架非常多。
python,性能差,但是開發效率高。常言道,人生苦短,我用Python就是因為這個。
js,主要用在前段,後端可以用但是很少。
php,主要用在後端。
go,主要用在後端,兼顧性能和開發效率。
dart,非常有競爭力的編程語言,flutter框架使用的語言,未來跨平台領域大有可為
Kotlin,goole力挺的替代java開發androidapp的編程語言。
還有很多。
根據自己的需求,選擇一門,然後學習基礎語法,基本用熟練,然後就可以嘗試一些簡單的項目了,這個時候一定要多閱讀別人的代碼,學習別人的數據結構的設計,語法的運用之類的,同時也要自己多動手練習。做出來幾個簡單項目後,你的自信心會大增,興趣也會更加盎然。接著就可以嘗試稍微復雜點的項目,實現自己設想的一些idea了。
如果你選擇在工作中提升,切記:工作可能會讓你失去編程的樂趣。但是,記住,這不是編程發生了變化,而是壓力、質疑、辛苦等讓它失去了樂趣。希望你能堅持下去,終能撥開雲霧,進入新的更高的境界。
PS、AI是UI設計師必不可少的兩項技能,對於想要學習UI設計的人來說,首先就是要學會使用PS和AI。如何才能快速學會這兩樣呢?下面,千鋒UI設計培訓就給大家分享20天學會UI設計(PS+AI)入門教程。
課程介紹
本套課程主要講解了PS的工具使用,介紹了蒙版,通道,濾鏡,圖層樣式和圖層混合模式等的基礎和應用案例。重點講解了AI的基礎使用方法,並結合AI軟體講解了如何進行品牌形象設計。
學完課程可以讓你熟練使用PS,掌握人像修圖,高級摳圖,圖像合成,海報製作,輕質感圖標製作等。熟練使用AI軟體,並能掌握logo設計、名片設計、單頁、折頁、易拉寶等設計,掌握VIS手冊的組成及設計製作。
課程目錄
第1章PS
1.初識Adobe
2.PS的版本迭代
3.PS入門介紹和用途
04PS界面及工作區介紹
05PS首選項設置
06文件的新建與打開
07文件的存儲和格式
08圖層的認識
09圖層的分類及功能
10PS軟體的基本操作
11移動工具的基本使用
12圖層的對齊
13圖層的分布對齊
14選框工具及選區的加減運算
15選框與填色的綜合使用
16選區的羽化
17套索和多邊形套索工具
18磁性套索工具
19魔棒工具的使用
20快速選擇工具
21選擇並遮住-細化毛發
22摳頭發
23PS的色彩范圍
24裁剪工具
25透視裁剪工具
26切片及切片選擇工具
27圖框工具
28畫筆工具
29畫筆面板
30定義畫筆預設和載入畫筆
31顏色替換工具
32橡皮擦工具
33背景橡皮擦
34魔術橡皮擦工具
35污點修復畫筆工具
36修復畫筆工具
37修補工具
38內容感知移動工具
39紅眼工具
40仿製圖章工具
41圖案圖章工具
42歷史記錄畫筆工具
43漸變工具
44油漆桶工具
45鋼筆工具的基礎使用
46形狀工具的基礎使用
47形狀工具的應用
48布爾運算應用
49布爾運算應用2
50文字工具
51字元和段落面板
52路徑文字
53模糊與銳化工具
54塗抹工具
55加深減淡工具
56海綿工具
57圖層蒙版
58剪貼蒙版的應用
59蒙版的應用
60圖層蒙版的應用-加倒影
61色相飽和度
62色彩平衡
63可選顏色
64色階
65曲線
66通道
67通道應用-摳頭發
68表面模糊濾鏡
69高斯模糊濾鏡
70動感模糊濾鏡
71徑向模糊濾鏡
72扭曲-波紋
73扭曲-極坐標
74扭曲-球面化
75風格化-風
76風格化-凸出
77液化
78液化-瘦臉
79高反差保留磨皮
80圖層樣式(一)
81圖層樣式(二)
82圖層樣式(三)
83圖層樣式(四)
84圖層樣式(五)
85溶解模式
86去亮、去暗型原理解析
87去亮型應用案例
88去暗型應用
89疊加和柔光模式
90圖層混合模式應用(一)
91圖層混合模式應用(二)
92什麼是AI
93界面分布和功能介紹
94新建文檔
95打開文件
96存儲文件
97AI的基礎操作
98填色與描邊
99矩形工具組
100選擇工具與直接選擇工具
101卡通形象繪制
102魔棒與套索工具
103鋼筆工具組
104剪刀與刻刀工具
105文字工具
106直線工具組
107畫筆工具組
108旋轉與鏡像工具
109摩天輪插畫製作
110形狀生成器
111形狀生成器的應用
112形狀生成器應用(二)
113實時上色工具
114實時上色工具的應用
115漸變工具
116混合工具
117混合工具的應用
118漸變與混合工具的應用
119路徑查找器(一)
120路徑查找器(二)
121路徑查找器的應用
122AI綜合應用-MBE風格圖標
123綜合應用-logo圖標的製作
124綜合應用-炫彩字製作
125綜合應用-2.5D字體
126綜合應用-偏移路徑
127綜合應用-圓形切圖形
128綜合應用-剪切蒙版製作紋理背景
129綜合應用-網格工具製作漸變背景
130綜合應用-符號
131綜合應用-飛出的粒子
132綜合應用-流光星球
133綜合應用-炫彩漸變線條
134AI夜景插畫-背景打造
135AI夜景插畫-樹木製作
136AI夜景插畫-樹木製作(二)
137AI夜景插畫-月亮和螢火蟲製作
138AI夜景插畫-麋鹿製作
139AI夜景插畫-葉子製作
140什麼是字體
141字體設計的重要性與方法
142字體的性格
143基礎造字法
144矩形造字法
145鋼筆造字法
146幾何元素法
147筆畫減細法
148形象替代法
149筆畫的簡化
150了解LOGO設計
151LOGO設計創意手法
152首字母創意手法
153首字母創意手法(二)
154具象手法
155徽章設計手法
156徽章設計手法(二)
157名片設計規范
158名片設計排版設計
159名片設計(一)
160名片設計(二)
161名片設計(三)
162名片設計(四)
163什麼是DM單頁
164DM單頁製作規范
165DM單頁頁頭設計
166DM單頁排版設計
167DM單頁頁頭設計
168宣傳單頁設計(二)
169三折頁設計規范
170三折頁設計(一)
171折頁設計(二)
172折頁設計(三)
173折頁設計(四)
174易拉寶設計規范
175易拉寶設計(一)
176易拉寶設計(二)
177企業VIS
178基礎識別系統
179應用設計系統
編程是個很廣泛的詞吧,編程其實是有很多語言的,如果不看語言的話,大致也可以分為前端與後端(註:其實編程不只是前端和後端,但是新手入門的話,建議還是從前後端會比較容易點,之後就會牽扯到框架等復雜的技術)。前端是指Web頁面(網站頁面)或app等前端界面,後端就是負責實現前端的功能業務,將前端需要的數據返回給前端顯示或做出反應。
新手編程入門可以從這幾點出發:
1.知道自己想要做什麼編程(前端或後端);
2.知道是前端還是後端之後,還要知道想要先從什麼語言入手。前端的話,建議可以先從HTML+CSS入手,後端的話,建議可以從C#入手,這只是本人的建議,並不是絕對的;
3.知道了自己想從哪個語言入手的話,就可以上官網查看文檔,看demo,如果還是不明白的話,就可以上網去搜索該語言的入門視頻,現在網路教程都是很詳細的;
4.編程入門之後就可以嘗試去實現下自己想的頁面或功能,這會增強自己的信心。
編程語言其實是有共通性的,如果你做到後面的話,就會發現學習其它語言就會快很多了,新手入門,不要急,慢慢來,堅持就會有收獲的。
剛開始學習編程語言,要怎麼去做,動手編寫一個編譯器,學習一下較為底層的編程方式,是一種學習計算機到底是如何工作的非常有效方法。編譯器通常被看作是十分復雜的工程。事實上,編寫一個產品級的編譯器也確實是一個龐大的任務。但是寫一個小巧可用的編譯器卻不是這么困難。踏出了編程入門教程第一步,接下去怎麼做就全看自己了。可以按照文章所指導的全部做一遍,然後製作一個更加復雜的編譯器。需要去寫一個更加精巧的語法樹來生成匯編代碼。接下去的幾步分別是:(1)允許返回任意的值(比如,return3;一些可執行代碼);(2)添加對「非」的支持(比如,return~1;一些可執行代碼)。每一個額外的特性都可以教你關於C語言的更多知識,編譯器到底是怎麼執行的,以及世界上其他編寫編譯器的人是如何想的。這是構建babyc的方法。Babyc現在已經擁有了if語句,循環,變數以及最基礎的數據結構。下面給大家展示一下國內最權威的.net訓練營學習路線圖:
B. 學習編程都學些什麼內容
編程先學邏輯,就是先執行什麼後執行什麼,能得出什麼樣的結果。接下來是學語法,比如for,if,while這些,都是根據不同語種學習不同的內容;到了高階就開始學習演算法,因為演算法可以協助做自己的框架,引擎等。用簡單的話來說,編程就是學習。一門計算機語言好比大家學習英文是為了跟外國人打交道,學習編程,就是跟計算機打交道。編程學習的內容有:C語言、Python、C++、Java Script、Java、Swift、R等。C. 學習編程好不好
不好學。未來發展十分不錯。
1、編程的課程比較抽象。
編程是依靠計算機進行運算,並最終得到相應結果的過程。需要將解決的問題思路、方法和手段讓計算機能夠根據人的指令一步一步去工作,完成某種特定的任務。這種人和計算體系之間交流的過程就是編程。編程的課程比較抽象,理解起來會有點困難。
2、編程更傾向於實操。
計算機專業的人對編程更有發言權,編程的理論性東西居多,但實際上陣時,全靠實際操作。所以如果沒有老師從旁指導,很難理解為什麼代碼要這樣寫?
3、編程學習需要花費時間。
計算機專業的學生學習編程會稍微輕松一些。但是計算機零基礎的人,建議先買本《計算機組成原理》或者《微機原理》看看,了解下計算機的體系結構。學習一門技術,需要花費長時間的心思和精力。
隨著互聯網和移動互聯網的發展,企業對於程序員的需求量也越來越大。編程的前景還是非常好的。
D. Java多線程程序設計詳細解析
一、理解多線程
多線程是這樣一種機制,它允許在程序中並發執行多個指令流,每個指令流都稱為一個線程,彼此間互相獨立。
線程又稱為輕量級進程,它和進程一樣擁有獨立的執行控制,由操作系統負責調度,區別在於線程沒有獨立的存儲空間,而是和所屬進程中的其它線程共享一個存儲空間,這使得線程間的通信遠較進程簡單。
多個線程的執行是並發的,也就是在邏輯上「同時」,而不管是否是物理上的「同時」。如果系統只有一個CPU,那麼真正的「同時」是不可能的,但是由於CPU的速度非常快,用戶感覺不到其中的區別,因此我們也不用關心它,只需要設想各個線程是同時執行即可。
多線程和傳統的單線程在程序設計上最大的區別在於,由於各個線程的控制流彼此獨立,使得各個線程之間的代碼是亂序執行的,由此帶來的線程調度,同步等問題,將在以後探討。
二、在Java中實現多線凱液慎程
我們不妨設想,為了創建一個新的線程,我們需要做些什麼?很顯然,我們必須指明這個線程所要執行的代碼,而這就是在Java中實現多線程我們所需要做的一切!
真是神奇!Java是如何做到這一點的?通過類!作為一個完全面向對象的語言,Java提供了類java.lang.Thread來方便多線程編程,這個類提供了大量的方法來方便我們控制自己的各個線程,我們以後的討論都將圍繞這個類進行。
那麼如何提供給 Java 我們要線程執行的代碼呢?讓我們來看一看 Thread 類。Thread 類最重要的方法是run(),它為Thread類的方法start()所調用,提供我們的線程所要執行的代碼。為了指定我們自己的代碼,只需要覆蓋它!
方法一:繼承 Thread 類,覆蓋方法 run(),我們在創建的 Thread 類的子類中重寫 run() ,加入線程所要執行的代碼即可。下面是一個例子:
public class MyThread extends Thread
{
int count= 1, number;
public MyThread(int num)
{
number = num;
System.out.println
("創建線程 " + number);
}
public void run() {
while(true) {
System.out.println
("線程 " + number + ":計數 " + count);
if(++count== 6) return;
}
}
public static void main(String args[])
{
for(int i = 0;
i 〈 5; i++) new MyThread(i+1).start();
}
}
這種方法簡單明了,符合大家的習慣,但是,它也有一個很大的缺點,那就是如果我們的類已經從一個類繼承(如小程序必須繼承自 Applet 類),則無法再繼承 Thread 類,這時如果我們又不想建立一個新的類,應該怎麼辦呢?
我們不妨來探索一種新的方法:我們不創建Thread類的子類,而是直接使用它,那麼我們只能將我們的方法作為參數傳遞給 Thread 類的實例,有點類似回調函數。但是 Java 沒有指針,我們只能傳遞一個包含這個方法的類的實例。
那麼如何限制這個類盯敬必須包含這一方法呢?當然是使用介面!(雖然抽象類也可滿足,但是需要繼承,而我們之所以要採用這種新方法,不就是為了避免繼承帶來的限制嗎?)
Java 提供了介面 java.lang.Runnable 來支持這種方法。
方法二:實現 Runnable 介面
Runnable介面只有一個方法run(),我們聲明自己的類實現Runnable介面並提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務。但是Runnable介面並沒有任何對線程的支持,我們還必須創建Thread類的實例,這一點通過Thread類的構造函數public Thread(Runnable target);來實現。下面埋禪是一個例子:
public class MyThread implements Runnable
{
int count= 1, number;
public MyThread(int num)
{
number = num;
System.out.println("創建線程 " + number);
}
public void run()
{
while(true)
{
System.out.println
("線程 " + number + ":計數 " + count);
if(++count== 6) return;
}
}
public static void main(String args[])
{
for(int i = 0; i 〈 5;
i++) new Thread(new MyThread(i+1)).start();
}
}
嚴格地說,創建Thread子類的實例也是可行的,但是必須注意的是,該子類必須沒有覆蓋 Thread 類的 run 方法,否則該線程執行的將是子類的 run 方法,而不是我們用以實現Runnable 介面的類的 run 方法,對此大家不妨試驗一下。
使用 Runnable 介面來實現多線程使得我們能夠在一個類中包容所有的代碼,有利於封裝,它的缺點在於,我們只能使用一套代碼,若想創建多個線程並使各個線程執行不同的代碼,則仍必須額外創建類,如果這樣的話,在大多數情況下也許還不如直接用多個類分別繼承 Thread 來得緊湊。
綜上所述,兩種方法各有千秋,大家可以靈活運用。
下面讓我們一起來研究一下多線程使用中的一些問題。
三、線程的四種狀態
1. 新狀態:線程已被創建但尚未執行(start() 尚未被調用)。
2. 可執行狀態:線程可以執行,雖然不一定正在執行。CPU 時間隨時可能被分配給該線程,從而使得它執行。
3. 死亡狀態:正常情況下 run() 返回使得線程死亡。調用 stop()或 destroy() 亦有同樣效果,但是不被推薦,前者會產生異常,後者是強制終止,不會釋放鎖。
4. 阻塞狀態:線程不會被分配 CPU 時間,無法執行。
四、線程的優先順序
線程的優先順序代表該線程的重要程度,當有多個線程同時處於可執行狀態並等待獲得 CPU 時間時,線程調度系統根據各個線程的優先順序來決定給誰分配 CPU 時間,優先順序高的線程有更大的機會獲得 CPU 時間,優先順序低的線程也不是沒有機會,只是機會要小一些罷了。
你可以調用 Thread 類的方法 getPriority() 和 setPriority()來存取線程的優先順序,線程的優先順序界於1(MIN_PRIORITY)和10(MAX_PRIORITY)之間,預設是5(NORM_PRIORITY)。
五、線程的同步
由於同一進程的多個線程共享同一片存儲空間,在帶來方便的同時,也帶來了訪問沖突這個嚴重的問題。Java語言提供了專門機制以解決這種沖突,有效避免了同一個數據對象被多個線程同時訪問。
由於我們可以通過 private 關鍵字來保證數據對象只能被方法訪問,所以我們只需針對方法提出一套機制,這套機制就是 synchronized 關鍵字,它包括兩種用法:synchronized 方法和 synchronized 塊。
1. synchronized 方法:通過在方法聲明中加入 synchronized關鍵字來聲明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制對類成員變數的訪問:每個類實例對應一把鎖,每個 synchronized 方法都必須獲得調用該方法的類實例的鎖方能執行,否則所屬線程阻塞,方法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,此後被阻塞的線程方能獲得該鎖,重新進入可執行狀態。
這種機制確保了同一時刻對於每一個類實例,其所有聲明為 synchronized 的成員函數中至多隻有一個處於可執行狀態(因為至多隻有一個能夠獲得該類實例對應的鎖),從而有效避免了類成員變數的訪問沖突(只要所有可能訪問類成員變數的方法均被聲明為 synchronized)。
在 Java 中,不光是類實例,每一個類也對應一把鎖,這樣我們也可將類的靜態成員函數聲明為 synchronized ,以控制其對類的靜態成員變數的訪問。
synchronized 方法的缺陷:若將一個大的方法聲明為synchronized 將會大大影響效率,典型地,若將線程類的方法 run() 聲明為 synchronized ,由於在線程的整個生命期內它一直在運行,因此將導致它對本類任何 synchronized 方法的調用都永遠不會成功。當然我們可以通過將訪問類成員變數的代碼放到專門的方法中,將其聲明為 synchronized ,並在主方法中調用來解決這一問題,但是 Java 為我們提供了更好的解決辦法,那就是 synchronized 塊。
2. synchronized 塊:通過 synchronized關鍵字來聲明synchronized 塊。語法如下:
synchronized(syncObject)
{
//允許訪問控制的代碼
}
#p#副標題#e#
synchronized 塊是這樣一個代碼塊,其中的代碼必須獲得對象 syncObject (如前所述,可以是類實例或類)的鎖方能執行,具體機制同前所述。由於可以針對任意代碼塊,且可任意指定上鎖的對象,故靈活性較高。
六、線程的阻塞為了解決對共享存儲區的訪問沖突,Java 引入了同步機制,現在讓我們來考察多個線程對共享資源的訪問,顯然同步機制已經不夠了,因為在任意時刻所要求的資源不一定已經准備好了被訪問,反過來,同一時刻准備好了的資源也可能不止一個。為了解決這種情況下的訪問控制問題,Java 引入了對阻塞機制的支持。
阻塞指的是暫停一個線程的執行以等待某個條件發生(如某資源就緒),學過操作系統的同學對它一定已經很熟悉了。Java 提供了大量方法來支持阻塞,下面讓我們逐一分析。
1. sleep() 方法:sleep() 允許 指定以毫秒為單位的一段時間作為參數,它使得線程在指定的時間內進入阻塞狀態,不能得到CPU 時間,指定的時間一過,線程重新進入可執行狀態。典型地,sleep() 被用在等待某個資源就緒的情形:測試發現條件不滿足後,讓線程阻塞一段時間後重新測試,直到條件滿足為止。
2. suspend() 和 resume() 方法:兩個方法配套使用,suspend()使得線程進入阻塞狀態,並且不會自動恢復,必須其對應的resume() 被調用,才能使得線程重新進入可執行狀態。典型地,suspend() 和 resume() 被用在等待另一個線程產生的結果的情形:測試發現結果還沒有產生後,讓線程阻塞,另一個線程產生了結果後,調用 resume() 使其恢復。
3. yield() 方法:yield() 使得線程放棄當前分得的 CPU 時間,但是不使線程阻塞,即線程仍處於可執行狀態,隨時可能再次分得 CPU 時間。調用 yield() 的效果等價於調度程序認為該線程已執行了足夠的時間從而轉到另一個線程。
4. wait() 和 notify() 方法:兩個方法配套使用,wait() 使得線程進入阻塞狀態,它有兩種形式,一種允許 指定以毫秒為單位的一段時間作為參數,另一種沒有參數,前者當對應的 notify() 被調用或者超出指定時間時線程重新進入可執行狀態,後者則必須對應的 notify() 被調用。
初看起來它們與 suspend() 和 resume() 方法對沒有什麼分別,但是事實上它們是截然不同的。區別的核心在於,前面敘述的所有方法,阻塞時都不會釋放佔用的鎖(如果佔用了的話),而這一對方法則相反。
上述的核心區別導致了一系列的細節上的區別。
首先,前面敘述的所有方法都隸屬於 Thread 類,但是這一對卻直接隸屬於 Object 類,也就是說,所有對象都擁有這一對方法。初看起來這十分不可思議,但是實際上卻是很自然的,因為這一對方法阻塞時要釋放佔用的鎖,而鎖是任何對象都具有的,調用任意對象的 wait() 方法導致線程阻塞,並且該對象上的鎖被釋放。
而調用 任意對象的notify()方法則導致因調用該對象的 wait() 方法而阻塞的線程中隨機選擇的一個解除阻塞(但要等到獲得鎖後才真正可執行)。
其次,前面敘述的所有方法都可在任何位置調用,但是這一對方法卻必須在 synchronized 方法或塊中調用,理由也很簡單,只有在synchronized 方法或塊中當前線程才佔有鎖,才有鎖可以釋放。
同樣的道理,調用這一對方法的對象上的鎖必須為當前線程所擁有,這樣才有鎖可以釋放。因此,這一對方法調用必須放置在這樣的 synchronized 方法或塊中,該方法或塊的上鎖對象就是調用這一對方法的對象。若不滿足這一條件,則程序雖然仍能編譯,但在運行時會出現IllegalMonitorStateException 異常。
wait() 和 notify() 方法的上述特性決定了它們經常和synchronized 方法或塊一起使用,將它們和操作系統的進程間通信機製作一個比較就會發現它們的相似性:synchronized方法或塊提供了類似於操作系統原語的功能,它們的執行不會受到多線程機制的干擾,而這一對方法則相當於 block 和wakeup 原語(這一對方法均聲明為 synchronized)。
它們的結合使得我們可以實現操作系統上一系列精妙的進程間通信的演算法(如信號量演算法),並用於解決各種復雜的線程間通信問題。
關於 wait() 和 notify() 方法最後再說明兩點:
第一:調用 notify() 方法導致解除阻塞的線程是從因調用該對象的 wait() 方法而阻塞的線程中隨機選取的,我們無法預料哪一個線程將會被選擇,所以編程時要特別小心,避免因這種不確定性而產生問題。
第二:除了 notify(),還有一個方法 notifyAll() 也可起到類似作用,唯一的區別在於,調用 notifyAll() 方法將把因調用該對象的 wait() 方法而阻塞的所有線程一次性全部解除阻塞。當然,只有獲得鎖的那一個線程才能進入可執行狀態。
談到阻塞,就不能不談一談死鎖,略一分析就能發現,suspend() 方法和不指定超時期限的 wait() 方法的調用都可能產生死鎖。遺憾的是,Java 並不在語言級別上支持死鎖的避免,我們在編程中必須小心地避免死鎖。
以上我們對 Java 中實現線程阻塞的各種方法作了一番分析,我們重點分析了 wait() 和 notify()方法,因為它們的功能最強大,使用也最靈活,但是這也導致了它們的效率較低,較容易出錯。實際使用中我們應該靈活使用各種方法,以便更好地達到我們的目的。
七、守護線程
守護線程是一類特殊的線程,它和普通線程的區別在於它並不是應用程序的核心部分,當一個應用程序的所有非守護線程終止運行時,即使仍然有守護線程在運行,應用程序也將終止,反之,只要有一個非守護線程在運行,應用程序就不會終止。守護線程一般被用於在後台為其它線程提供服務。
可以通過調用方法 isDaemon() 來判斷一個線程是否是守護線程,也可以調用方法 setDaemon() 來將一個線程設為守護線程。
八、線程組
線程組是一個 Java 特有的概念,在 Java 中,線程組是類ThreadGroup 的對象,每個線程都隸屬於唯一一個線程組,這個線程組在線程創建時指定並在線程的整個生命期內都不能更改。
你可以通過調用包含 ThreadGroup 類型參數的 Thread 類構造函數來指定線程屬的線程組,若沒有指定,則線程預設地隸屬於名為 system 的系統線程組。
在 Java 中,除了預建的系統線程組外,所有線程組都必須顯式創建。在 Java 中,除系統線程組外的每個線程組又隸屬於另一個線程組,你可以在創建線程組時指定其所隸屬的線程組,若沒有指定,則預設地隸屬於系統線程組。這樣,所有線程組組成了一棵以系統線程組為根的樹。
Java 允許我們對一個線程組中的所有線程同時進行操作,比如我們可以通過調用線程組的相應方法來設置其中所有線程的優先順序,也可以啟動或阻塞其中的所有線程。
Java 的線程組機制的另一個重要作用是線程安全。線程組機制允許我們通過分組來區分有不同安全特性的線程,對不同組的線程進行不同的處理,還可以通過線程組的分層結構來支持不對等安全措施的採用。
Java 的 ThreadGroup 類提供了大量的方法來方便我們對線程組樹中的每一個線程組以及線程組中的每一個線程進行操作。
九、總結
在本文中,我們講述了 Java 多線程編程的方方面面,包括創建線程,以及對多個線程進行調度、管理。我們深刻認識到了多線程編程的復雜性,以及線程切換開銷帶來的多線程程序的低效性,這也促使我們認真地思考一個問題:我們是否需要多線程?何時需要多線程?
多線程的核心在於多個代碼塊並發執行,本質特點在於各代碼塊之間的代碼是亂序執行的。我們的程序是否需要多線程,就是要看這是否也是它的內在特點。
假如我們的程序根本不要求多個代碼塊並發執行,那自然不需要使用多線程;假如我們的程序雖然要求多個代碼塊並發執行,但是卻不要求亂序,則我們完全可以用一個循環來簡單高效地實現,也不需要使用多線程;只有當它完全符合多線程的特點時,多線程機制對線程間通信和線程管理的強大支持才能有用武之地,這時使用多線程才是值得的。
#p#副標題#e#
E. 全面解析C#中的非同步編程
當我們處理一些長線的調用時,經常會導致界面停止響應或者IIS線程佔用過多等問題,這個時候我們需要更多的是用非同步編程來修正這些問題,但是通常都是說起來容易做起來難,誠然非同步編程相對於同步編程來說,它是一種完全不同的編程思想,對於習慣了同步編程的開發者來說,在開發過程中難度更大,可控性不強是它的特點。
在.NET
Framework5.0種,微軟為我們系統了新的語言特性,讓我們使用非同步編程就像使用同步編程一樣相近和簡單,本文中將會解釋以前版本的Framework中基於回調道德非同步編程模型的一些限制以及新型的API如果讓我們簡單的做到同樣的開發任務。
為什麼要非同步
一直以來,使用遠程資源的編程都是一個容易造成困惑的問題,不同於“本地資源”,遠程資源的訪問總會有很多意外的情況,網路環境的不穩定機器服務端的故障,會造成很多程序員完全不可控的問題,所以這也就要求程序員需要更多的去保護遠程資源的調用,管理調用的取消、超市、線程的等待以及處理線程長時間沒響應的情況等。而在.NET中我們通常忽略了這些挑戰,事實上我們會有多種不用的模式來處理非同步編程,比如在處理IO密集型操作或者高延遲的操作時候不組測線程,多數情況我們擁有同步和非同步兩個方法來做這件事。可是問題在於當前的這些模式非常容易引起混亂和代碼錯誤,或者開發人員會放棄然後使用阻塞的方式去開發。
而在如今的.NET中,提供了非常接近於同步編程的編程體驗,不需要開發人員再去處理只會在非同步編程中出現的很多情況,非同步調用將會是清晰的且不透明的,而且易於和同步的代碼進行組合使用。
過去糟糕的體驗
最好的理解這種問題的方式是我們最常見的一種情況:用戶界面只擁有一個線程所有的工作都運行在這個線程上,客戶端程序不能對用戶的滑鼠時間做出反應,這很可能是因為應用程序正在被一個耗時的操作所阻塞,這可能是因為線程在等待一個網路ID或者在做一個CPU密集型的計算,此時用戶界面不能獲得運行時間,程序一直處於繁忙的狀態,這是一個非常差的用戶體驗。
很多年來,解決這種問題的方法都是做非同步花的調用,不要等待響應,盡快的返回請求,讓其他事件可以同時執行,只是當請求有了最終反饋的時候通知應用程序讓客戶代碼可以執行指定的代碼。
而問題在於:非同步代碼完全毀掉了代碼流程,回調代理解釋了之後如何工作,但是怎麼在一個while循環里等待?一個if語句?一個try塊或者一個using塊?怎麼去解釋“接下來做什麼”?
看下面的一個例子:
public
int
SumPageSizes(IList
uris)
{
int
total
=
0;
foreach
(var
uri
in
uris)
{
txtStatus.Text
=
string.Format("Found
{0}
bytes...",
total);
var
data
=
new
WebClient().DownloadData(uri);
total
+=
data.Length;
}
txtStatus.Text
=
string.Format("Found
{0}
bytes
total",
total);
return
total;
}
這個方法從一個uri列表裡下載文件,統計他們的大小並且同時更新狀態信息,很明顯這個方法不屬於UI線程因為它需要花費非常長的時間來完成,這樣它會完全的掛起UI,但是我們又希望UI能被持續的更新,怎麼做呢?
我們可以創建一個後台編程,讓它持續的給UI線程發送數據來讓UI來更新自身,這個看起來是很浪費的,因為這個線程把大多時間花在等下和下載上,但是有的時候,這正是我們需要做的。在這個例子中,WebClient提供了一個非同步版本的DownloadData方法—DownloadDataAsync,它會立即返回,然後在DownloadDataCompleted後觸發一個事件,這允許用戶寫一個非同步版本的方法分割所要做的事,調用立即返回並完成接下來的UI線程上的調用,從而不再阻塞UI線程。下面是第一次嘗試:
public
void
SumpageSizesAsync(IList
uris)
{
SumPageSizesAsyncHelper(uris.GetEnumerator(),
0);
}
public
void
SumPageSizesAsyncHelper(IEnumerator
enumerator,
int
total)
{
if
(enumerator.MoveNext())
{
txtStatus.Text
=
string.Format("Found
{0}
bytes...",
total);
var
client
=
new
WebClient();
client.DownloadDataCompleted
+=
(sender,e)=>{
SumPageSizesAsyncHelper(enumerator,
total
+
e.Result.Length);
};
client.DownloadDataAsync(enumerator.Current);
}
else
{
txtStatus.Text
=
string.Format("Found
{0}
bytes
total",
total);
}
}
然後這依然是糟糕的,我們破壞了一個整潔的foreach循環並且手動獲得了一個enumerator,每一個調用都創建了一個事件回調。代碼用遞歸取代了循環,這種代碼你應該都不敢直視了吧。不要著急,還沒有完
。
原始的代碼返回了一個總數並且顯示它,新的一步版本在統計還沒有完成之前返回給調用者。我們怎麼樣才可以得到一個結果返回給調用者,答案是:調用者必須支持一個回掉,我們可以在統計完成之後調用它。
然而異常怎麼辦?原始的代碼並沒有關注異常,它會一直傳遞給調用者,在非同步版本中,我們必須擴展回掉來讓異常來傳播,在異常發生時,我們不得不明確的讓它傳播。
F. 什麼叫編程
編程即編定程序,就是讓計算機解決某個問題。
編程是編定程序的中文簡稱,是讓計算機代為解決某個問題,對某個計算體系規定一定的運算方式,使計算體系按照該計算方式運行,並最終得到相應結果的過程。
為了使計算機能夠理解人的意圖,人類就必須將需解決的問題的思路、方法和手段通過計算機能夠理解的形式告訴計算機,使得計算機能夠根據人的指令去工作,完成某種特定的任務。這種人和計算體系之間交流的過程就是編程的本質。
(6)編程什麼叫全解析擴展閱讀
學習編程有很多好處:
1、學習編程, 不僅可以提升個人的未來的社會競爭力, 也可以為當下的升學競爭添加籌碼。
2、編程不僅可以提升外在的競爭力, 也可以增強人們內在的邏輯思維能力和自信心。
3、編程是鍛煉邏輯思維能力的重要"載體",學習編程可以讓思維變得嚴謹和縝密。
4、學習編程可以增強對現實問題進行抽象、對復雜問題進行分解、對解決方案進行推演、對程序進行測試的能力。
G. 編程是什麼課程內容
編程是屬於計算機專業課程。編程技術是指藉助於計算機來達到某一目的或解決某個問題的技術,使用某種程序設計語言編寫程序代碼,最終得到結果。編輯程序讓電腦執行的過程就叫編程。計算機專業是計算機硬體與軟體相結合、面向系統、側重應用的寬口徑專業。
相關內容解釋:
計算機編程專業的培養目標:
1、掌握電子技術和計算機組成與體系結構的基本原理,能從事計算機硬體系統開發與設計。
2、掌握程序設計語言、基本知識與基本技能,具有較強的程序設計能力,能從事系統軟體和大型應用軟體的開發與研製。
H. 編程是什麼 什麼是編程
什麼是編程
一、編程語言
機器語言:是機器能直接識別的程序語言或指令代碼。計算機是基於二進制的0和1來處理運算,這種0和1的組合指令又叫做機器語言。
編譯器:就像中國人和外國人說話要把中文翻譯成英文一樣。代碼要運行,就要把代碼翻譯成機器語言,這個過程叫做編譯,用來處理代碼編譯的軟體叫做編譯器。
編程語言:用來定義計算機程序的形式語言,用來向計算機發出指令。簡單來說,就是人類和計算機進行交流的語言。
二、計算機如何處理程序?
按照馮·諾依曼存儲程序的原理,計算機的工作流程大致如下:
用戶打開程序,程序開始執行;
操作系統將程序內容和相關數據送入計算機的內存;
CPU根據程序內容從內存中讀取指令;
CPU分析、處理指令,並為取下一條指令做准備;
取下一條指令並分析、處理,如此重復操作,直至執行完程序中的全部指令;
最後,將計算的結果放入指令指定的存儲器地址。
希望對您有所幫助!~