中國Java之父張孝祥去世------給it人士的思考

   

 我曾聽他的Java編程視頻教程,JavaScript編程視頻教程,從中獲得不少啓發。他的課程Java開發郵件客戶端端項目,JavaAPI等,他的書籍有不少是關於Java,他勤於好學,對黑客編程,測試都精通,號稱王牌培訓員,他的教學圖片:java

如他用Java編寫不死機的程序,代碼以下:程序員

 

jdk版本:
  		java version "1.6.0_10-rc2"
		Java(TM) SE Runtime Environment (build 1.6.0_10-rc2-b32)
		Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)
 */

/*類名:ThreadTest
 * 類型:public
 * 方法:main() 用來生成四個新線程
 * 成員數據:無
 */
public class ThreadTest 
{
	public static void main(String[] argv)
	{		
		ThreadR tt = new ThreadR();
		new Thread(tt).start();				
		new Thread(tt).start();
		new Thread(tt).start();
		new Thread(tt).start();
	}
}
/*類名:ThreadR
 * 類型:接口Runnable的實現類
 * 方法:run()
 * 成員數據:ticket 整形
 */
class ThreadR implements Runnable
{
	static int ticket=1000;

	public void run()
	{			
		while(true)
		{					
				if(ticket >0)
				{							
					System.out.println(/*"TestThread run:"*/Thread.currentThread().getName()+"salling:"+ticket--);
				}											
		}					
	}
}
其實我知道怎麼解決,只是這種狀況太恐怖了

public class thread 
{
	public static void main(String[] argv)
	{
		
		TestThread tt = new TestThread();
		new Thread(tt).start();
		try{Thread.sleep(10);}catch(Exception e){}
		tt.str = new String("method");
		new Thread(tt).start();
		new Thread(tt).start();
		new Thread(tt).start();
	}
}

class TestThread implements Runnable
{
	static int ticket=1000;
	boolean active=true;
	String str = new String("");
	public void run()
	{
		while(active)
		{
			if(str.equals("method"))
			{
				while(active)
				{
					sale();
				}
			}		
		}

	}
	public synchronized void sale()
	{
		if(ticket >0)
		{
			//synchronized(str){}
			System.out.print("sale()");
			System.out.println(/*"TestThread run:"*/Thread.currentThread().getName()+"salling:"+ticket--);
		}
		else
		{
			active=false;
			try{Thread.sleep(10);}catch(Exception e){}
		}
	}
}

 

 

修改Java代碼,使程序不死機 :編程

 

class ThreadR implements Runnable {
	static int ticket = 20;

	public void run() {
		while (true) {
			try {
				if (ticket > 0) {
					System.out.println(/* "TestThread run:" */Thread
							.currentThread().getName()
							+ "salling:" + ticket--);
					Thread.sleep(1000);
				}
				else{
					System.exit(0);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

		}
	}
}
你的while(true)死循環,沒跳出。並且當一個線程佔用資源的時候,你要給其餘的線程訪問資源的機會,因此用	Thread.sleep(1000);。

還有他講的java.concurrent線程併發的課程,我曾作過筆記,以下:小程序

 

java.util.concurrent併發庫是JDK1.5新提供的,在JDK1.5以前,Java中要進行業務併發時,一般須要有程序員獨立完成代碼實現,而當針對高質量Java多線程併發程序設計時,爲防止死蹦等現象的出現,好比使用java以前的wait()、notify()和synchronized等,往往須要考慮性能、死鎖、公平性、資源管理以及如何避免線程安全性方面帶來的危害等諸多因素,每每會採用一些較爲複雜的安全策略,加劇了程序員的開發負擔.萬幸的是,在JDK1.5出現以後,Sun大神(Doug Lea)終於爲咱們這些可憐的小程序員推出了java.util.concurrent工具包以簡化併發完成。開發者們藉助於此,將有效的減小競爭條件(race conditions)和死鎖線程。concurrent包很好的解決了這些問題,爲咱們提供了更實用的併發程序模型。數組

java.util.concurrent包分紅了三個部分,分別是java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.lock。內容涵蓋了併發集合類、線程池機制、同步互斥機制、線程安全的變量更新工具類、鎖等等經常使用工具。 安全

java.util.concurrent包:多線程

 

接口摘要
BlockingDeque<E> 支持兩個附加操做的 Queue,這兩個操做是:獲取元素時等待雙端隊列變爲非空;存儲元素時等待雙端隊列中的空間變得可用。
BlockingQueue<E> 支持兩個附加操做的 Queue,這兩個操做是:獲取元素時等待隊列變爲非空,以及存儲元素時等待空間變得可用。
Callable<V> 返回結果而且可能拋出異常的任務。
CompletionService<V> 將生產新的異步任務與使用已完成任務的結果分離開來的服務。
ConcurrentMap<K,V> 提供其餘原子 putIfAbsent、remove、replace 方法的 Map
ConcurrentNavigableMap<K,V> 支持 NavigableMap 操做,且以遞歸方式支持其可導航子映射的ConcurrentMap
Delayed 一種混合風格的接口,用來標記那些應該在給定延遲時間以後執行的對象。
Executor 執行已提交的 Runnable 任務的對象。
ExecutorService Executor 提供了管理終止的方法,以及可爲跟蹤一個或多個異步任務執行情況而生成 Future 的方法。
Future<V> Future 表示異步計算的結果。
RejectedExecutionHandler 沒法由 ThreadPoolExecutor 執行的任務的處理程序。
RunnableFuture<V> 做爲 Runnable 的 Future
RunnableScheduledFuture<V> 做爲 Runnable 的 ScheduledFuture
ScheduledExecutorService 一個 ExecutorService,可安排在給定的延遲後運行或按期執行的命令。
ScheduledFuture<V> 一個延遲的、結果可接受的操做,可將其取消。
ThreadFactory 根據須要建立新線程的對象。
類摘要
AbstractExecutorService 提供 ExecutorService 執行方法的默認實現。
ArrayBlockingQueue<E> 一個由數組支持的有界阻塞隊列
ConcurrentHashMap<K,V> 支持獲取的徹底併發和更新的所指望可調整併發的哈希表。
ConcurrentLinkedQueue<E> 一個基於連接節點的無界線程安全隊列
ConcurrentSkipListMap<K,V> 可縮放的併發 ConcurrentNavigableMap 實現。
ConcurrentSkipListSet<E> 一個基於 ConcurrentSkipListMap 的可縮放併發 NavigableSet 實現。
CopyOnWriteArrayList<E> ArrayList 的一個線程安全的變體,其中全部可變操做(add、set 等等)都是經過對底層數組進行一次新的複製來實現的。
CopyOnWriteArraySet<E> 對其全部操做使用內部 CopyOnWriteArrayList 的 Set
CountDownLatch 一個同步輔助類,在完成一組正在其餘線程中執行的操做以前,它容許一個或多個線程一直等待。
CyclicBarrier 一個同步輔助類,它容許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。
DelayQueue<E extends Delayed> Delayed 元素的一個無界阻塞隊列,只有在延遲期滿時才能從中提取元素。
Exchanger<V> 能夠在對中對元素進行配對和交換的線程的同步點。
ExecutorCompletionService<V> 使用提供的 Executor 來執行任務的 CompletionService
Executors 此包中所定義的ExecutorExecutorServiceScheduledExecutorServiceThreadFactory和 Callable 類的工廠和實用方法。
FutureTask<V> 可取消的異步計算。
LinkedBlockingDeque<E> 一個基於已連接節點的、任選範圍的阻塞雙端隊列
LinkedBlockingQueue<E> 一個基於已連接節點的、範圍任意的 blocking queue
PriorityBlockingQueue<E> 一個無界阻塞隊列,它使用與類 PriorityQueue 相同的順序規則,而且提供了阻塞獲取操做。
ScheduledThreadPoolExecutor ThreadPoolExecutor,它可另行安排在給定的延遲後運行命令,或者按期執行命令。
Semaphore 一個計數信號量。
SynchronousQueue<E> 一種阻塞隊列,其中每一個插入操做必須等待另外一個線程的對應移除操做 ,反之亦然。
ThreadPoolExecutor 一個 ExecutorService,它使用可能的幾個池線程之一執行每一個提交的任務,一般使用 Executors 工廠方法配置。
ThreadPoolExecutor.AbortPolicy 用於被拒絕任務的處理程序,它將拋出 RejectedExecutionException.
ThreadPoolExecutor.CallerRunsPolicy 用於被拒絕任務的處理程序,它直接在 execute 方法的調用線程中運行被拒絕的任務;若是執行程序已關閉,則會丟棄該任務。
ThreadPoolExecutor.DiscardOldestPolicy 用於被拒絕任務的處理程序,它放棄最舊的未處理請求,而後重試execute;若是執行程序已關閉,則會丟棄該任務。
ThreadPoolExecutor.DiscardPolicy 用於被拒絕任務的處理程序,默認狀況下它將丟棄被拒絕的任務。
枚舉摘要
TimeUnit TimeUnit 表示給定單元粒度的時間段,它提供在這些單元中進行跨單元轉換和執行計時及延遲操做的實用工具方法。

java.util.concurrent.lock包:併發

接口摘要
Condition Condition 將 Object 監視器方法(waitnotify 和 notifyAll)分解成大相徑庭的對象,以便經過將這些對象與任意 Lock 實現組合使用,爲每一個對象提供多個等待 set(wait-set)。
Lock Lock 實現提供了比使用 synchronized 方法和語句可得到的更普遍的鎖定操做。
ReadWriteLock ReadWriteLock 維護了一對相關的,一個用於只讀操做,另外一個用於寫入操做。
類摘要
AbstractOwnableSynchronizer 能夠由線程以獨佔方式擁有的同步器。
AbstractQueuedLongSynchronizer 以 long 形式維護同步狀態的一個 AbstractQueuedSynchronizer 版本。
AbstractQueuedSynchronizer 爲實現依賴於先進先出 (FIFO) 等待隊列的阻塞鎖和相關同步器(信號量、事件,等等)提供一個框架。
LockSupport 用來建立鎖和其餘同步類的基本線程阻塞原語。
ReentrantLock 一個可重入的互斥鎖 Lock,它具備與使用 synchronized 方法和語句所訪問的隱式監視器鎖相同的一些基本行爲和語義,但功能更強大。
ReentrantReadWriteLock 支持與 ReentrantLock 相似語義的 ReadWriteLock 實現。
ReentrantReadWriteLock.ReadLock ReentrantReadWriteLock.readLock() 方法返回的鎖。
ReentrantReadWriteLock.WriteLock ReentrantReadWriteLock.writeLock() 方法返回的鎖。

 

java.util.concurrent.atomic包:框架

 

類摘要
AtomicBoolean 能夠用原子方式更新的 boolean 值。
AtomicInteger 能夠用原子方式更新的 int 值。
AtomicIntegerArray 能夠用原子方式更新其元素的 int 數組。
AtomicIntegerFieldUpdater<T> 基於反射的實用工具,能夠對指定類的指定 volatile int 字段進行原子更新。
AtomicLong 能夠用原子方式更新的 long 值。
AtomicLongArray 能夠用原子方式更新其元素的 long 數組。
AtomicLongFieldUpdater<T> 基於反射的實用工具,能夠對指定類的指定 volatile long 字段進行原子更新。
AtomicMarkableReference<V> AtomicMarkableReference 維護帶有標記位的對象引用,能夠原子方式對其進行更新。
AtomicReference<V> 能夠用原子方式更新的對象引用。
AtomicReferenceArray<E> 能夠用原子方式更新其元素的對象引用數組。
AtomicReferenceFieldUpdater<T,V> 基於反射的實用工具,能夠對指定類的指定 volatile 字段進行原子更新。
AtomicStampedReference<V> AtomicStampedReference 維護帶有整數「標誌」的對象引用,能夠用原子方式對其進行更新。

至今記憶尤新。。。。。。。他講的Java課,太詳細,太敬業,光記代碼,我有一本很厚的代碼筆記。其餘講師講的Java課,不很詳細。異步

光靠聰明還不行,沒有勤奮是不行的,畢竟天道酬勤

惋惜英年早逝???

 

張孝祥老師是一個很是好的老師,他的授課視頻曾經給予過我莫大的幫助。

首先我要指出的是,他不是傳統意義的‘碼農’,教育這個領域我認爲和純粹的技術開發仍是有區別的。

心臟病猝死自從我進入互聯網行業以來,經歷得已然太多了。身邊的朋友,同事,其餘公司的朋友。

程序員這個工種不能否認是互聯網中壓力,消耗最大的一個職業。

 

 

碼農真的很辛苦 加班熬夜是常事 聽說如今都不叫碼農了 改叫碼畜。身體垮了一切都是浮雲

 

 

我以爲如張孝祥、喬布斯這些事業成功人士他們天天的事務比較多,精神也長期處於高度緊張的狀態,這也是致使他們身體情況降低的主要因素。

英國諺語:「good message,bad message?"

獲取高額利益,代價倒是death。喜憂參半。

青春賺到錢卻換不來青春。

人生很矛盾?

 

代碼記錄一籮筐

如何預防:

    除了敲擊電腦代碼外,最好作戶外運動,用來保護眼睛疲勞,運動:

   鍛鍊身體是必要的,it行業屬於腦力活動,容易腦衰,每每作了軟件項目後,全身冰冷。

   總之身體第一,賺錢纔是第二位的。

願他在天堂安息吧 阿門

   my advice

相關文章
相關標籤/搜索